注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

长风明志的博客

不要也不能做下一个谁,应该且可以做第一个自己

 
 
 

日志

 
 

Qt数据库 利用QSqlQuery类执行SQL语句 【转】  

2011-07-29 12:04:25|  分类: QT编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

本文介绍的是Qt数据库 利用QSqlQuery类执行SQL语句,SQL即结构化查询语言,是关系数据库的标准语言。详细内容我们先来看内容。

AD:

本文介绍的是Qt数据库 利用QSqlQuery类执行SQL语句,是本文要介绍的内容,SQL即结构化查询语言,是关系数据库的标准语言。前面已经提到,在Qt中利用QSqlQuery类实现了执行SQL语句。需要说明,我们这里只是Qt教程,而非专业的数据库教程,所以我们不会对数据库中的一些知识进行深入讲解,下面只是对最常用的几个知识点进行讲解。

我们下面先建立一个工程,然后讲解四个知识点,分别是:

1、操作SQL语句返回的结果集。

2、在SQL语句中使用变量。

3、批处理操作。

4、事务操作。

我们新建Qt4 Gui Application工程,我这里工程名为query ,然后选中QtSql模块,(注:在新版的Qt Creator中可能没有模块选择页面,我们需要手动在.pro工程文件中添加代码“QT += sql” )Base class选QWidget。工程建好后,添加C++ Header File ,命名为connection.h ,更改其内容如下:

  1. #ifndef CONNECTION_H  
  2. #define CONNECTION_H  
  3. #include <QMessageBox> 
  4. #include <QSqlDatabase> 
  5. #include <QSqlQuery> 
  6.  
  7. static bool createConnection()  
  8. {  
  9.     QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);  
  10.     db.setDatabaseName(“:memory:”);  
  11.     if (!db.open()) {  
  12.         QMessageBox::critical(0, qApp->tr(“Cannot open database”),  
  13.             qApp->tr(“Unable to establish a database connection.”  
  14.                      ), QMessageBox::Cancel);  
  15.         return false;  
  16.     }  
  17.  
  18.     QSqlQuery query;  
  19.     query.exec(“create table student (id int primary key, ”  
  20.                “name varchar(20))”);  
  21.     query.exec(“insert into student values(0, ‘first’)”);  
  22.     query.exec(“insert into student values(1, ‘second’)”);  
  23.     query.exec(“insert into student values(2, ‘third’)”);  
  24.     query.exec(“insert into student values(3, ‘fourth’)”);  
  25.     query.exec(“insert into student values(4, ‘fifth’)”);  
  26.     return true;  
  27. }  
  28. #endif // CONNECTION_H 

然后更改main.cpp的内容如下:

  1. #include <QtGui/QApplication> 
  2. #include “widget.h”  
  3. #include “connection.h”  
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.      
  8.     if (!createConnection())  
  9.         return 1;  
  10.      
  11.     Widget w;  
  12.     w.show();  
  13.     return a.exec();  

可以看到,我们是在主函数中打开数据库的,而数据库连接用一个函数完成,并单独放在一个文件中,这样的做法使得主函数很简洁。我们今后使用数据库时均使用这种方法。我们打开数据库连接后,新建了一个学生表,并在其中插入了几条记录。

Qt数据库 利用QSqlQuery类执行SQL语句

表中的一行就叫做一条记录,一列是一个属性。这个表共有5条记录,id和name两个属性。程序中的“id int primary key”表明id属性是主键,也就是说以后添加记录时,必须有id项。

下面我们打开widget.ui文件,在设计器中向界面上添加一个Push Button ,和一个Spin Box 。将按钮的文本改为“查询”,然后进入其单击事件槽函数,更改如下。

  1. void Widget::on_pushButton_clicked()  
  2. {  
  3.     QSqlQuery query;  
  4.     query.exec(“select * from student”);  
  5.     while(query.next())  
  6.     {  
  7.         qDebug() << query.value(0).toInt() << query.value(1).toString();  
  8.     }  

我们在widget.cpp中添加头文件:

  1. #include <QSqlQuery> 
  2. #include <QtDebug> 

然后运行程序,单击“查询”按钮,效果如下:

Qt数据库 利用QSqlQuery类执行SQL语句

可以看到在输出窗口,表中的所有内容都输出出来了。这表明我们的数据库连接已经成功建立了。

操作SQL语句返回的结果集。

在上面的程序中,我们使用query.exec(“select * from student”);来查询出表中所有的内容。其中的SQL语句“select * from student”中“*”号表明查询表中记录的所有属性。而当query.exec(“select * from student”);这条语句执行完后,我们便获得了相应的执行结果,因为获得的结果可能不止一条记录,所以我们称之为结果集。

结果集其实就是查询到的所有记录的集合,而在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的有:

seek(int n) :query指向结果集的第n条记录。

first() :query指向结果集的第一条记录。

last() :query指向结果集的最后一条记录。

next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。

previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。

record() :获得现在指向的记录。

value(int n) :获得属性的值。其中n表示你查询的第n个属性,比方上面我们使用“select * from student”就相当于“select id, name from student”,那么value(0)返回id属性的值,value(1)返回name属性的值。该函数返回QVariant类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant。

at() :获得现在query指向的记录在结果集中的编号。

需要说明,当刚执行完query.exec(“select * from student”);这行代码时,query是指向结果集以外的,我们可以利用query.next(),当第一次执行这句代码时,query便指向了结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec(“select * from student”);这行代码前加上query.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。

下面将“查询”按钮的槽函数更改如下:

  1. void Widget::on_pushButton_clicked()  
  2. {  
  3.     QSqlQuery query;  
  4.     query.exec(“select * from student”);  
  5.     qDebug() << “exec next() :”;  
  6.     if(query.next())  
  7.     //开始就先执行一次next()函数,那么query指向结果集的第一条记录  
  8.     {  
  9.         int rowNum = query.at();  
  10.         //获取query所指向的记录在结果集中的编号  
  11.         int columnNum = query.record().count();  
  12.         //获取每条记录中属性(即列)的个数  
  13.         int fieldNo = query.record().indexOf(“name”);  
  14.         //获取”name”属性所在列的编号,列从左向右编号,最左边的编号为0  
  15.         int id = query.value(0).toInt();  
  16.         //获取id属性的值,并转换为int型  
  17.        QString name = query.value(fieldNo).toString();  
  18.         //获取name属性的值  
  19.         qDebug() << “rowNum is : ” << rowNum //将结果输出  
  20.                 << ” id is : ” << id 
  21.                 << ” name is : ” << name 
  22.                 << ” columnNum is : ” << columnNum;  
  23.     }  
  24.     qDebug() << “exec seek(2) :”;  
  25.     if(query.seek(2))  
  26.     //定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0  
  27.     {  
  28.         qDebug() << “rowNum is : ” << query.at()  
  29.                 << ” id is : ” << query.value(0).toInt()  
  30.                 << ” name is : ” << query.value(1).toString();  
  31.     }  
  32.     qDebug() << “exec last() :”;  
  33.     if(query.last())  
  34.     //定位到结果集中最后一条记录  
  35.     {  
  36.         qDebug() << “rowNum is : ” << query.at()  
  37.                 << ” id is : ” << query.value(0).toInt()  
  38.                 << ” name is : ” << query.value(1).toString();  
  39.     }  

然后在widget.cpp文件中添加头文件。

  1. #include <QSqlRecord> 

运行程序,结果如下:

Qt数据库 利用QSqlQuery类执行SQL语句

本文章原创于www.yafeilinux.com

小结:Qt数据库 利用QSqlQuery类执行SQL语句 上篇 的内容后介绍完了,希望本文对你有帮助!要想深入了解数据库的话,请参考

Qt数据库 利用QSqlQuery类执行SQL语句 中篇

本文介绍的是Qt数据库 利用QSqlQuery类执行SQL语句,SQL即结构化查询语言,是关系数据库的标准语言。详细内容我们先来看内容。

AD:

Qt数据库 利用QSqlQuery类执行SQL语句 下篇是本节需要介绍的内容,接着上一篇教程。Qt数据库 利用QSqlQuery类执行SQL语句 上篇 ,也不多说了,直接看内容。

SQL语句中使用变量。

我们先看下面的一个例子,将“查询”按钮的槽函数更改如下:

  1. void Widget::on_pushButton_clicked()  
  2. {  
  3.     QSqlQuery query;  
  4.     query.prepare(“insert into student (id, name) ”  
  5.                   “values (:id, :name)”);  
  6.     query.bindValue(0, 5);  
  7.     query.bindValue(1, “sixth”);  
  8.     query.exec();  
  9.  
  10.     //下面输出最后一条记录  
  11.     query.exec(“select * from student”);  
  12.     query.last();  
  13.     int id = query.value(0).toInt();  
  14.     QString name = query.value(1).toString();  
  15.     qDebug() << id << name;  

运行效果如下:

Qt数据库 利用QSqlQuery类执行SQL语句 中篇

可以看到,在student表的最后又添加了一条记录。在上面的程序中,我们先使用了prepare()函数,在其中利用了“:id”和“:name”来代替具体的数据,而后又利用bindValue()函数给id和name两个属性赋值,这称为绑定操作。其中编号0和1分别代表“:id”和“:name”,就是说按照prepare()函数中出现的属性从左到右编号,最左边是0 。这里的“:id”和“:name”,叫做占位符,这是ODBC数据库的表示方法,还有一种Oracle的表示方法就是全部用“?”号。如下:

  1. query.prepare(“insert into student (id, name) ”  
  2.                   “values (?, ?)”);  
  3. query.bindValue(0, 5);  
  4. query.bindValue(1, “sixth”);  
  5. query.exec(); 

我们也可以利用addBindValue()函数,这样就可以省去编号,它是按顺序给属性赋值的,如下:

  1. query.prepare(“insert into student (id, name) ”  
  2.                   “values (?, ?)”);  
  3. query.addBindValue(5);  
  4. query.addBindValue(“sixth”);  
  5. query.exec(); 

当用ODBC的表示方法时,我们也可以将编号用实际的占位符代替,如下:

  1. query.prepare(“insert into student (id, name) ”  
  2.                       “values (:id, :name)”);  
  3. query.bindValue(“:id”, 5);  
  4. query.bindValue(“:name”, “sixth”);  
  5. query.exec(); 

以上各种形式的表示方式效果是一样的。特别注意,在最后一定要执行exec()函数,所做的操作才能被真正执行。

下面我们就可以利用绑定操作在SQL语句中使用变量了。

  1. void Widget::on_pushButton_clicked()  
  2. {  
  3.     QSqlQuery query;  
  4.     query.prepare(“select name from student where id = ?”);  
  5.     int id = ui->spinBox->value(); //从界面获取id的值  
  6.     query.addBindValue(id); //将id值进行绑定  
  7.     query.exec();  
  8.     query.next(); //指向第一条记录  
  9.     qDebug() << query.value(0).toString();  

运行程序,效果如下:

Qt数据库 利用QSqlQuery类执行SQL语句 中篇

我们改变spinBox的数值大小,然后按下“查询”按钮,可以看到对应的结果就出来了。

小结:Qt数据库 利用QSqlQuery类执行SQL语句 中篇的内容介绍完了,希望本节内容对你有帮助,想继续深入了解的话,请参考

Qt数据库 利用QSqlQuery类执行SQL语句 下篇



  评论这张
 
阅读(1645)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017