Level : WORDPRESS BOOK LINKEDIN PATENT Send Mail 동냥하기 hajunho.com

objc2C++select 구현 예제

C++ / / 2021. 5. 26. 13:26
반응형

SELECT
    a.seq
  , a.nm_logi_file
  , a.nm_phys_file
  , a.yn_mbil_add
FROM ddtbt_atch_file_dtil2 a
INNER JOIN ddtbt_tppg b ON a.id_atch_file = b.id_dwg_atch_file
WHERE b.cd_tppg = '';

를 구현한다고 하면...

-(DDTBT_ATCH_FILE_DTIL *) hjhImageFileTitledMapReturn:(NSString *) param
{
    NSString *query = [NSString stringWithFormat:@"select a.seq, a.nm_logi_file, a.nm_phys_file, a.yn_mbil_add from ddtbt_atch_file_dtil2 a \
                       inner join ddtbt_tppg b on a.id_atch_file=b.id_dwg_atch_file \
                       where b.cd_tppg='%@';"
                       ,param
                       ];
    NSLog(@" hjhImageFileTitledMapReturn query = %@", query);
    [self checkBackDB];
    
    if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {  //성공적으로 열림
        const char *sqlStatement = [query cStringUsingEncoding:NSUTF8StringEncoding];
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            // Loop through the results and add them to the feeds array
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                DDTBT_ATCH_FILE_DTIL *atch = [[DDTBT_ATCH_FILE_DTIL alloc] init];
                atch.seq = sqlite3_column_int(compiledStatement, 0);
                atch.nm_logi_file = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                atch.nm_phys_file = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                atch.yn_mbil_add = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                
                NSLog(@"hjhImageFileTitledMapReturn2 %@ %ld %@ %@", atch.nm_logi_file, (long)atch.seq, atch.nm_phys_file, atch.yn_mbil_add);
                sqlite3_finalize(compiledStatement);
                [self checkBackDB];
                return atch;
            }
        }
        // Release the compiled statement from memory
        sqlite3_finalize(compiledStatement);
        [self checkBackDB];
    } else {
        [self checkBackDB];
    }
    
    return nil;
}

 

C++에서 SQLite를 직접 다루는 예제를 작성하면 다음과 같습니다. 오브젝티브-C의 객체지향 스타일 대신, C++의 스타일로 SQL 쿼리를 실행하고 결과를 처리하는 방법을 보여드리겠습니다.

C++에서는 SQLite3 라이브러리를 직접 사용할 수 있습니다. 다음 코드는 위의 Objective-C 코드를 C++로 변환한 예제입니다:

```cpp
#include <iostream>
#include <memory>
#include <string>
#include <sqlite3.h>

class DDTBT_ATCH_FILE_DTIL {
public:
    int seq;
    std::string nm_logi_file;
    std::string nm_phys_file;
    std::string yn_mbil_add;
};

// SQLite 데이터를 처리하는 함수
std::unique_ptr<DDTBT_ATCH_FILE_DTIL> hjhImageFileTitledMapReturn(const std::string& param, const std::string& databasePath) {
    sqlite3* database;
    // Open the database
    if (sqlite3_open(databasePath.c_str(), &database) == SQLITE_OK) {  // 성공적으로 열림
        std::string query = "SELECT a.seq, a.nm_logi_file, a.nm_phys_file, a.yn_mbil_add "
                            "FROM ddtbt_atch_file_dtil2 a "
                            "INNER JOIN ddtbt_tppg b ON a.id_atch_file = b.id_dwg_atch_file "
                            "WHERE b.cd_tppg = '" + param + "';";

        sqlite3_stmt* compiledStatement;
        if (sqlite3_prepare_v2(database, query.c_str(), -1, &compiledStatement, nullptr) == SQLITE_OK) {
            // Loop through the results and add them to the record
            while (sqlite3_step(compiledStatement) == SQLITE_ROW) {
                auto atch = std::make_unique<DDTBT_ATCH_FILE_DTIL>();
                atch->seq = sqlite3_column_int(compiledStatement, 0);
                atch->nm_logi_file = reinterpret_cast<const char*>(sqlite3_column_text(compiledStatement, 1));
                atch->nm_phys_file = reinterpret_cast<const char*>(sqlite3_column_text(compiledStatement, 2));
                atch->yn_mbil_add = reinterpret_cast<const char*>(sqlite3_column_text(compiledStatement, 3));

                std::cout << "hjhImageFileTitledMapReturn2 " << atch->nm_logi_file 
                          << " " << atch->seq 
                          << " " << atch->nm_phys_file 
                          << " " << atch->yn_mbil_add 
                          << std::endl;

                sqlite3_finalize(compiledStatement); // 완료된 후 statement를 정리합니다
                sqlite3_close(database); // Database 연결 닫기
                return atch; // 한 개의 레코드만 반환합니다
            }
        }
        // Release the compiled statement from memory
        sqlite3_finalize(compiledStatement);
    } else {
        std::cerr << "Failed to open the database" << std::endl;
    }

    sqlite3_close(database); // Database 연결 닫기
    return nullptr;
}

int main() {
    std::string param = ""; // 적절한 매개변수를 여기에 설정합니다
    std::string databasePath = "path/to/your/database.sqlite"; // 적절한 데이터베이스 경로를 설정합니다
    
    auto result = hjhImageFileTitledMapReturn(param, databasePath);
    
    if (result) {
        std::cout << "Query successful! Seq: " << result->seq 
                  << ", Logical File Name: " << result->nm_logi_file 
                  << ", Physical File Name: " << result->nm_phys_file 
                  << ", Mobile Add: " << result->yn_mbil_add 
                  << std::endl;
    } else {
        std::cout << "No result or query failed." << std::endl;
    }

    return 0;
}
```

### 핵심 포인트:
1. **쿼리 문자열과 데이터베이스 경로 설정**: C++에서는 쿼리를 문자열 형태로 구성하고 SQLite를 열고 닫습니다.
2. **SQLite3 라이브러리 사용**: `sqlite3_open`, `sqlite3_prepare_v2`, `sqlite3_step`, `sqlite3_finalize`, `sqlite3_close` 등의 함수를 사용하여 쿼리를 실행합니다.
3. **결과 저장**: 결과를 `DDTBT_ATCH_FILE_DTIL` 구조체에 저장한 후 유일한 포인터를 반환하여 메모리 누수를 방지합니다.

이 코드는 C++에서 SQLite3를 사용하여 데이터베이스에 쿼리를 실행하고 결과를 처리하는 예제입니다. 

반응형

'C++' 카테고리의 다른 글

objc2C++UIAlertController  (0) 2021.05.31
C++와 Swift를 활용한 iOS 프로퍼티 정리  (0) 2021.05.26
sqlite3 파일 생성  (0) 2021.05.26
sql 공통 .h, .m 작성법  (0) 2021.05.26
iOS Photokit  (0) 2021.05.26
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기