Qt中SQL QSqlQuery 对象中prepare()函数的用法

时间:2023-01-22 10:50:23

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/wenwen10090215@126/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()中用?表示的量替换成相对应的数值量(intfloaat,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()可以正确显示。

转自: