Qt中利用SQL對資料庫的操作和prepare()函數的使用
Qt資料庫的初學說明
Qt中可以建立一個資料庫,比如:QSqlDatabasedb;這是一個資料庫對象db,在操作之前我們需要用QSQLITE去驅動它連結它,db=QSqlDatabase::addDatabase("QSQLITE");然後可以設定他的名字db.setDatabaseName(“”),再到後面我們可以打開它db.open(),打開成功後我們可以對他進行某些操作比如查詢:那麼又像
對檔案操作一樣,我們得建立一個QSqlQuery Sql對象,然後他負責對資料庫的所有操作!包括讀,寫,删除,添加等等。
QT中的SQL中QQuery對象對資料庫操作分為兩步,先是用prepare()函數準備,然後調用exec()函數去執行,執行結果就是該函數的傳回值。
有關資料庫的更多操作在下面的連結中都有給出
http://blog.163.com/[email protected]/blog/static/173322114201261784889/
Qt之資料庫操作:http://blog.sina.com.cn/s/blog_a6fb6cc90101gx30.html
http://blog.csdn.net/fer_ba/article/details/4582205
還有在SQL文法問題可以在以下連結中尋找:http://www.w3school.com.cn/sql/sql_where.asp
由于SQL文法大部分都是在prepare()中實作的,下面主要說明prepare()的用法!和标準的SQL還是有差別的
Qt中prepare()用法:
說明:為什麼需要要綁定:這是因為在prepare()中雖然是标準的SQL指令,但是對于具體的數值類的量不可能在string表示出來,那麼不能表示的量就用?代替,這樣就需要額外添加綁定指令addBindValue(),把prepare()中用?表示的量替換成相對應的數值量(int,floaat,QString等等),而且替換是是按照?出現順序替換的,然後在執行exec()時就可以更新到資料庫中
或者可以用:string而不用?(string就代表一個字元串而已),這時我們可以用bindValue(“:string”,value);去綁定資料單,然後更新,這個就可以不按照出現順序綁定。但是:string一定是和它要替換的列的值對應的。而且綁定還可以省略,也就是設為NULL。
建立表:
”CREATE TABLE Table_Name (item1 int,item2 varchar(30),item3float,……)“
說明:Table_Name是你要建的表的名字,item1,item2.等等表示表中的列,每個item後面的表示該列資料性質。注意括号裡不可為空,因為空表是不可以建立成功的。
例如: sql_query.prepare("CREATETABLEPersons1(id int,name varchar(30),slary int,ageint)");
在表中插入新行
“INSERT INTO Table_Name (item1,item2,item3...) VALUES(?,?,?...)”
“INSERT INTO Table_Name(item1,item2,item3...) VALUES (:id,:name,:etc...)”
在使用prepare()函數後,我們還得使用addBindValue(value)按照上面的item順序來綁定值,具體值為value(該值一定要和對應的item想對應)!!!綁定成功後調用exec()就可以執行插入操作,寫入資料庫,成功與否就看exec()傳回值了。
例如:用第一種方法綁定
sql_query.prepare("INSERTINTOPersons(id,name,slary)VALUES(?,?,?)");
sql_query.addBindValue(2);
sql_query.addBindValue("taopeng");
sql_query.addBindValue(25);
if(sql_query.exec())
或者:第二種方法:
sql_query.prepare("INSERTINTOPersons(id,name,age)VALUES(:id,:name,:bbb)");
sql_query.bindValue(":id",4);
sql_query.bindValue(":name","taopeng");
sql_query.bindValue(":bbb",25);
:bbb其實不重要,隻不過是相當與一個辨別符,而age,或者name這些是比較重要的,他們指定了插入的列。
更新
“UPDATE Table_Name SET item1= ?,item2 =? WHERE id = ?”
同樣也是綁定
例如:
sql_query.prepare("UPDATEPersonsSETage=?,name=?WHEREid=?");
sql_query.addBindValue(18);
sql_query.addBindValue("taoxiaopeng");
sql_query.addBindValue(1);
sql_query.exec();
或者:
sql_query.prepare("UPDATEPersonsSETage=:age,name=:hahaWHEREid=:hehe");
sql_query.bindValue(":age",18);
sql_query.bindValue(":haha","taoxiaopeng");
sql_query.bindValue(":hehe",4);
sql_query.exec();
删除
“DELETE FROM Table_Name Whereitem = ?”
“DELETE FROM Table_Name Whereitem = :item”
例如:
sql_query.prepare("DELETEFROMPersonsWHEREid=:hehe");
//sql_query.bindValue(":age",30);
//sql_query.bindValue(":haha","taoxiaopeng");
sql_query.bindValue(":hehe",4);
或者
sql_query.prepare("DELETEFROMPersonsWHEREid=?");
//sql_query.bindValue(":age",30);
//sql_query.bindValue(":haha","taoxiaopeng");
sql_query.addBindValue(3);
//sql_query.bindValue(":hei",18);
AND 和OR
這個主要用在WHERE中指定查表或者删除時的條件。
查詢選取
SELECT * FROM Table_Name // 選取所有列
SELECT item,item1,item2 FROMTable_Name//選取item,item1,item2這些列。
而讀取結果可以用value()函數讀取,參數可以是QString :”item”,”item1”,或者是整型資料,整型資料表示該列是表中的第幾列(從0開始)。
例如:
sql_query.prepare("SELECT*FROMPersons");
if(sql_query.exec())
{
qDebug()<<"readsuccessfully";
while(sql_query.next())
{
intid=sql_query.value("id").toInt();
qDebug()<<"id:"<<id;
QStringname=sql_query.value("name").toString();
qDebug()<<"name:"<<name;
intsalary=sql_query.value("slary").toInt();
qDebug()<<"salary:"<<salary;
intage=sql_query.value("age").toInt();
qDebug()<<"age:"<<age;
}
}
else
{
qDebug()<<"insertfailed";
}
注意:為了顯示每一個條目用了while(sql_query.next()),因為第一次讀出來sql_query是指在一個空的地區,不是表中第一個條目。是以用next()可以正确顯示。
轉自: