在項目中遇到需要判斷sqlite資料庫中某個表是否存在,上網搜索一些資料后,解決了問題,如下:
首先,在每個sqlite資料庫中,都有一個名為sqlite_master的表,它定義了資料庫的模式,它的結構如下:
sqlite_master (
type TEXT, //專案的型別,如table、index、view、trigger
name TEXT, //專案的名稱,如表名、索引名等
tbl_name TEXT, //所從屬的表名,如索引所在的表名,對于表來說,該列就是表名本身
rootpage INTEGER, //專案在資料庫頁中存盤的編號,對于視圖和觸發器,該列值為0或者NULL
sql TEXT //創建該專案的SQL陳述句
);
這個表中記錄了資料庫中的相關資訊,我們通過在這個表中查找我們需要判斷的表來判斷其是否存在,相關代碼如下:
char strFindTable[128];
sprintf_s(strFindTable, "SELECT * FROM where type ='table' and name ='%s'", tabletname); //tablename為表名
sqlite3_stmt* stmt0 = NULL;
if (sqlite3_prepare_v2(conn, strFindTable, strlen(strFindTable), &stmt0, NULL) != SQLITE_OK) {
if (stmt0)
sqlite3_finalize(stmt0);
sqlite3_close(conn);
cout << "陳述句初始化錯誤";
return;
}
int r = sqlite3_step(stmt0);
//判斷表存在,結果集是否已到末尾
//通過sqlite3_step命令執行創建表的陳述句,對于DDL和DML陳述句而言, sqlite3_step執行正確的回傳值
//只有SQLITE_DONE,對于SELECT查詢而言,如果有資料回傳SQLITE_ROW,當到達結果集末尾時則回傳SQLITE_DONE,
if (r == SQLITE_DONE){
cout<<"table doesn't existed";
}
else if (r == SQLITE_ROW){
cout<<"table had existed";
}
這里要注意的是,當sqlite_master表中沒有我們查詢的表時,它回傳的結果集并不會為空,它先回傳表項,所以需要使用sqlite3_step,該函式用于評估sqlite3_prepare函式回傳的prepared_statement物件,在執行完該函式之后,prepared_statement物件的內部指標將指向其回傳的結果集的第一行,如果打算進一步迭代其后的資料行就需要不斷的呼叫該函式,直到所有的資料行都遍歷完畢,在這里,使用了sqlite3_step之后,如果回傳的是SQLITE_DONE,就說明結果集到了末尾,也就是說沒有找到我們判斷存在與否的表,即表不存在;如果回傳的是SQLITE_ROW,說明在sqlite_master中找到了表相關的資訊,即表存在,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/93380.html
標籤:C++
上一篇:C/C++ return *this和return this的區別
下一篇:c++ 記憶體二進制表示
