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 |
최근댓글