天天看點

Qt中SQL QSqlQuery 對象中prepare()函數的用法

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()可以正确顯示。

轉自: