SQLiteをC++から呼び出す(3:Select)

今回は前回までのテーブルからSelectを実行してみる。

現在のテーブルの中身はこんな感じ

このテーブルからDISP_IDが「ID123456」なレコードをSelectするソースが下記のようになった。

void CMainFrame::OnSelect()
{
	sqlite3* db;
	int err;
	_TCHAR* db_name = _T("c:\\SQLiteDB\\testDB.db");

	// データベースを開く
	err = sqlite3_open16(db_name, &db);

	if (err != SQLITE_OK)
	{
		AfxMessageBox( _T("openErr") ) ;
		
		//オープンに失敗してもCloseする必要があるらしい
		sqlite3_close(db);
		return ;
	}

	sqlite3_stmt* select_stmt;
	CString strSQL ;
	int iColCount ;
	
	int id ;
	CString strDispID ;
	CString strName ;
	CString strComment ;
	CString strOutput ;
	CString strMess ;
	strMess.Empty() ;
		
	strSQL = _T("SELECT ID, DISP_ID, NAME, COMMENT FROM TEST_TABLE WHERE DISP_ID = ?") ;
	err = sqlite3_prepare16(db, strSQL, -1, &select_stmt, NULL);

	// select_stmtの内部バッファを一旦クリア
	sqlite3_reset(select_stmt);

	CString strWhereID ;
	
	//IDの指定は
	strWhereID = _T("ID123456") ;

	err = sqlite3_bind_text16(select_stmt, 1, strWhereID, strWhereID.GetLength()*sizeof(_TCHAR), SQLITE_STATIC );

	if( err == SQLITE_OK && select_stmt )
	{
		iColCount =  sqlite3_column_count(select_stmt) ;
	
		while (SQLITE_ROW == ( err = sqlite3_step(select_stmt)))
		{
			id = sqlite3_column_int(select_stmt, 0);
			strDispID = (_TCHAR*)sqlite3_column_text16(select_stmt, 1);
			strName = (_TCHAR*)sqlite3_column_text16(select_stmt, 2);
			strComment = (_TCHAR*)sqlite3_column_text16(select_stmt, 3);

			strOutput.Format( _T(" id=%d \n dispID:%s\n name:%s\n comment:%s\n\n\n"), id, strDispID, strName, strComment ) ;
			strMess += strOutput ;
		}		
	}
	AfxMessageBox( strMess, MB_OK|MB_ICONINFORMATION ) ;

	sqlite3_finalize(select_stmt);
	sqlite3_close(db);
}

実行結果はこんな感じ

seraphyさんの記事をかなり参照しつつなんとか書いてみたのだが、DBのオープンに失敗してもCloseする必要があるっていうのは知らなかった。

次はどうしよう...同じかもしれないけど、UPDATE、DELETEまでやればひととおり?

(つづく)

ネスぺ22 β版 本物のネットワークスペシャリストになるための最も詳しい過去問解説と合格のコツ

ネスぺ22 β版 本物のネットワークスペシャリストになるための最も詳しい過去問解説と合格のコツ

↑秋はなんとかこれを.....