溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SQLite第三課 使用例子

發(fā)布時間:2020-09-06 05:50:46 來源:網(wǎng)絡(luò) 閱讀:532 作者:fengyuzaitu 欄目:軟件技術(shù)

1 打開數(shù)據(jù)庫文件
? sqlite3* m_db = NULL;
? int ret = sqlite3_open_v2("test.db", &db, SQLITE_OPEN_READWRITE, NULL);
? if (ret != SQLITE_OK)
? {
??? return;
? }

2 如果表不存在,創(chuàng)建表
char szCreateUserDataSql[1024] = "create table if not exists tb_user (id INTEGER ,\
??? type INTEGER,\
??? kind INTEGER)";

3 創(chuàng)建唯一的主鍵ID
char szCreateUserDataSql[1024] = "create table if not exists tb_user (id INTEGER PRIMARY KEY AUTOINCREMENT,\
??? type INTEGER,\
??? kind INTEGER)";

4 查詢
? char szSql[1024] = {0};
? sprintf(szSql, "select distinct * from tb_test");
? sqlite3_stmt* stmt = NULL;
? sqlite3_prepare(m_db, szSql, -1, &stmt, 0);
? while (sqlite3_step(stmt) == SQLITE_ROW)
? {
??? const unsigned char*? szPOIName = sqlite3_column_text(stmt, 0);
??? char szName[128] = {0};
??? if (szPOIName)
??? {
????? sprintf(szName, "%s", szPOIName);
??? }
??? int kx = sqlite3_column_int(stmt, 3);
??? float x = sqlite3_column_double(stmt, 5);
? }
? sqlite3_finalize(stmt);

5 獲取sql執(zhí)行失敗的錯誤信息
char* errMsg = NULL;
char* szSql = "select * from address";
nRet = sqlite3_exec(pDB, szSql, NULL, NULL ,&errMsg);
if (nRet != SQLITE_OK)
{
?? cout<<errMsg<<endl;
?? sqlite3_free(errMsg);
}
注意:釋放errMsg指向的內(nèi)存
6 關(guān)閉數(shù)據(jù)庫
? sqlite3_close(db);


7迭代查詢
char* pszSql = "select * from tableA where id >= ?"

當出現(xiàn)上面的sql語句的情況下,需要對?進行填充,這個時候就會
調(diào)用sqlite3_bind_int函數(shù)對該?進行填充

sqlite3_bind_int(stmt, 1, 2);

詳細的說明:第二個參數(shù)表示對第一個?(可能有多個?),2表示填充到?
的值

對于使用回調(diào)和預編譯語句獲取記錄集的方式比較
回調(diào):一次性讀取所有的記錄集
預編譯語句:每次使用sqlite3_step獲取到一條記錄了數(shù)據(jù)

代碼:
??? sqlite3_stmt *stmt = NULL;
??? int ret = sqlite3_prepare();
??? ret = sqlite3_bind_int(stmt, 1, id);
??? ret = sqlite3_step(stmt);
??? const char *mst = sqlite3_errstr(ret);

分析:
1)
??? mst的錯誤提示:library routine called out of sequence
通過網(wǎng)上搜索是多線程訪問數(shù)據(jù)庫導致的問題,結(jié)果通讀代碼,發(fā)現(xiàn)沒有多線程訪問數(shù)據(jù)庫,并且正常銷毀stmt對象

2)
??? 嘗試手動執(zhí)行命令語句,出錯提示如下:no such column:admin
說明SQL語句有問題,測試sqlite3_prepare函數(shù)的返回值,出錯提示如下:SQL logic error or missing database。通過修改SQL語句,終于可以正常查詢。

總結(jié):sqlite3_prepare函數(shù)會分析SQL語句是否編寫正確,如果不正確就會返回錯誤,導致下面的查詢失敗


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI