在QT中使用sqlite

2021-09-23 13:20:59 字數 4598 閱讀 1258

sqlite(sql)是一款開源輕量級的資料庫軟體,不需要server,可以整合在其他軟體中,非常適合嵌入式系統。

qt5以上版本可以直接使用sqlite(qt自帶驅動)。

引入sql模組

在qt專案檔案(.pro檔案)中,加入sql模組:

qt += sql
#include #include #include
檢查連線、新增資料庫驅動、設定資料庫名稱、資料庫登入使用者名稱、密碼。

qsqldatabase database;

if (qsqldatabase::contains("qt_sql_default_connection"))

else

上述**解釋:

(1)第一行中,建立了乙個qsqldatabase物件,後續的操作要使用這個物件。

(2)if語句用來檢查指定的連線(connection)是否存在。這裡指定的連線名稱(connection name)是qt_sql_default_connection,這是qt預設連線名稱。實際使用時,這個名稱可以任意取。如果判斷此連線已經存在,那麼qsqldatabase::contains()函式返回true。此時,進入第乙個分支,qsqldatabase::database()返回這個連線。

(3)如果這個連線不存在,則進入else分支,需要建立連線,並新增資料庫。在else分支第一行,adddatabase()的引數qsqlite是sqlite對應的驅動名,不能改。而且需要注意的是,adddatabase()的第二個引數被省略了,第二個引數的預設引數就是上面提到的qt預設連線名稱qt_sql_default_connection。如果需要使用自定義的連線名稱(如果程式需要處理多個資料庫檔案的話就會這樣),則應該加入第二個引數,例如

database = qsqldatabase::adddatabase("qsqlite", "my_sql_connection);
這個時候,如果在另乙個地方需要判斷my_sql_connection連線是否存在,就應該使用if (qsqldatabase::contains("my_sql_connection"))

(4)else分支第二行中,setdatabasename()的引數是資料庫檔名。如果這個資料庫不存在,則會在後續操作時自動建立;如果已經存在,則後續的操作會在已有的資料庫上進行。

(5)else分支後面兩行,設定使用者名稱和密碼。使用者名稱,密碼都可以隨便取,也可以省略。

使用open()開啟資料庫,並判斷是否成功。注意,在第一步檢查連線是否存在時,如果連線存在,則在返回這個連線的時候,會預設將資料庫開啟。

if (!database.open())

else

如果開啟成功,則進入else分支。對資料庫的操作都需要在else分支中進行。

資料庫操作完成後,最好關閉。

database.close();
對資料庫進行操作需要用到qsqlquery類,操作前必須定義乙個物件。下面舉例說明操作方法。操作需要使用sqlite語句,本文中的幾個例子會使用幾個常用的語句,關於sqlite語句的具體資訊請參考sqlite相關資料。

例1:建立**

建立乙個名為student的**,**包含三列,第一列是id,第二列是名字,第三列是年齡。

qsqlquery sql_query;

qstring create_sql = "create table student (id int primary key, name varchar(30), age int)";

sql_query.prepare(create_sql);

if(!sql_query.exec())

else

**解釋:

(1)第一行定義乙個qsqlquery物件。

(2)第二行是乙個qstring,其中的內容是sqlite語句。對資料庫的操作,都是用sqlite的語句完成的,把這些指令以qstring型別,通過prepare函式,儲存在qsqlquery物件中。也可將指令,以qstring形式直接寫在exec()函式的引數中,例如:

sql_query.exec("create table student (id int primary key, name varchar(30), age int)");
建立**語句:create table (f1 type1, f2 type2,…);

create table是建立**的語句,也可用大寫create table;student是**的名稱,可以任意取;括號中是**的格式,上述指令表明,**中有三列,第一列的名稱(表頭)是id,這一列儲存的資料型別是int,第二列名稱是name,資料型別是字元陣列,最多有30個字元(和char(30)的區別在於,varchar的實際長度是變化的,而char的長度始終是給定的值),第三列的名稱是age,資料型別是int。

如果sql_query.exec()執行成功,則建立**成功。

例2:插入資料

在剛才建立的**中,插入一行資料。

qstring insert_sql = "insert into student values (?, ?, ?)";

sql_query.prepare(insert_sql);

sql_query.addbindvalue(max_id+1);

sql_query.addbindvalue("wang");

sql_query.addbindvalue(25);

if(!sql_query.exec())

else

if(!sql_query.exec("insert into student values(3, \"li\", 23)"))

else

插入語句:insert into values (value1, value2,…);

insert into是插入語句,student是**名稱,values()是要插入的資料。這裡,我們插入了2組資料。插入第一組資料的時候,用addbindvalue來替代語句中的?,替代的順序與addbindvalue呼叫的順序相同。插入第二組資料的時候,則是直接寫出完整語句。

例3:更新資料(修改資料)

qstring update_sql = "update student set name = :name where id = :id";

sql_query.prepare(update_sql);

sql_query.bindvalue(":name", "qt");

sql_query.bindvalue(":id", 1);

if(!sql_query.exec())

else

語句:update set , … where ;

更新(修改)的語句是update...set...,其中student是**名稱,name是表頭名稱(即第二列),:name是待定的變數,where用於確定是哪一組資料,:id也是待定變數。

bindvalue(" ", " ")函式用來把語句中的待定變數換成確定值。

例4:查詢資料

(1)查詢部分資料

qstring select_sql = "select id, name from student";

if(!sql_query.exec(select_sql))

else

}

這個就是在語句中用max來獲取最大值。

例5:刪除與清空

(1)刪除一條資料

qstring delete_sql = "delete from student where id = ?";

sql_query.prepare(delete_sql);

sql_query.addbindvalue(0);

if(!sql_query.exec())

else

這裡沒有用where給出限制,就會刪除所有內容。

**:

在Qt中使用SQLite資料庫

sqlite sql 是一款開源輕量級的資料庫軟體,不需要server,可以整合在其他軟體中,非常適合嵌入式系統。qt5以上版本可以直接使用sqlite qt自帶驅動 引入sql模組 在qt專案檔案 pro檔案 中,加入sql模組 qt sql include include include檢查連線...

在c 中使用SQlite

1.生成 lib 檔案 第一步 找到lib.exe所在目錄 一般都在x program files microsoft visual studio vc98 bin下,在 執行 中輸入cmd,然後切換到該目錄下 第二步 使用lib命令生成.lib檔案 很多網頁上都介紹,使用lib def sqlit...

在ABP中使用SQLite

使用abp連線sqlite時出現下面錯誤 system.data.entity.core.entityexception the underlying provider failed on open.內部異常 argumentexception isolationlevel 找了好久才解決,記錄一下...