2008/07/24

C++ 코드로 SQLite v3 질의결과 row 단위로 컨트롤하기

정확히 어느 버전부터 지원을 하는지는 모르겠지만 sqlite v3 이후부터는 sqlite3_exec 에 의한 질의방식 외에 보다 더 자세히 데이터를 컨트롤 할 수 있는 방법을 지원한다.

방법은 아래 함수를 이용해서 할 수 있다.
    * sqlite3_prepare()
    * sqlite3_step()
    * sqlite3_column()
    * sqlite3_finalize()

prepared statement 를 이용하는 방법으로 sqlite3_prepare 함수로 prepared statement 를 수행하고 sqlite3_step 함수를 이용해서 한 row씩 진행하면서 sqlite3_column 함수를 이용하여 각각의 column 에 접근하는 방법이다. 모든 수행을 마치고 sqlite3_finalize 로 마무리 하면 된다.



    sqlite3* pSQLite3 = NULL;
sqlite3_stmt* pStmt = NULL;

int rst = sqlite3_open( "test.db", &pSQLite3 );

if ( rst )
{
TRACE( "Can't open database: %s\n", sqlite3_errmsg( pSQLite3 ));

sqlite3_close( pSQLite3 );
pSQLite3 = NULL;
}
else
{
const char szQuery[1024] = "SELECT * FROM MEMBER";
const char* szChar;

if ( sqlite3_prepare( pSQLite3, szQuery, 1024, &pStmt, &szChar )
== SQLITE_OK )
{
int nRow = sqlite3_data_count( pStmt );
TRACE( "sqlite3_data_count() : %d\n", nRow );

int nCol = sqlite3_column_count( pStmt );
TRACE( "sqlite3_column_count() : %d\n", nCol );

const char* col1name = sqlite3_column_name( pStmt, 0 );
const char* col2name = sqlite3_column_name( pStmt, 1 );

int nRowCnt = 0;
while ( sqlite3_step( pStmt ) == SQLITE_ROW )
{
++nRowCnt;

const unsigned char* col1 = sqlite3_column_text( pStmt, 0 );
const unsigned char* col2 = sqlite3_column_text( pStmt, 1 );

TRACE( "ROW %d: %s => %s, %s => %s \n",
nRowCnt, col1name, col1, col2name, col2 );
}
}

sqlite3_finalize( pStmt );

sqlite3_close( pSQLite3 );
pSQLite3 = NULL;
}


데모프로젝트

No comments :

Post a Comment