SQL执行操作

QSqlQuery提供了对数据库记录的Select、Insert、Update、Delete操作。

SELECT操作:

QSqlQuery query;

query.exec("SELECT name, salary FROM employee WHERE salary > 50000");

while (query.next()) {

QString name =query.value(0).toString();

int salary = query.value(1).toInt();

qDebug() << name << salary;

}

通过QSqlQuery::next() 下一条

QSqlQuery::previous() 上一条

QSqlQuery::first() 第一条

QSqlQuery::last() 最后一条

QSqlQuery::seek(),定位任意一条记录的位置。

列数、字段数:query.record().count()

行数,记录数 query.size();

sql="SELECT * FROM sys";

            query.exec(sql);

            rec=query.record();
            int numRows;
            while (query.next())
            {
                if (db.driver()->hasFeature(QSqlDriver::QuerySize))
                {
                //驱动支持返回记录数
                numRows = query.size();
                }
                else
                {
                  //驱动不支持返回记录数,只能循环查找
                 query.last();
                 numRows = query.at() + 1;
                }
            }

值:query.value(0)

INSERT操作:

//单一插入数据

QSqlQuery query;

query.prepare("INSERT INTO employee (id, name, salary) "

"VALUES (:id, :name, :salary)");

query.bindValue(":id", 1001);

query.bindValue(":name", "Thad Beaumont");

query.bindValue(":salary", 65000);

query.exec();

//批量插入数据

QSqlQuery query;

query.prepare("insert into myTable values (?, ?)");

QVariantList ints;

ints << 1 << 2 << 3 << 4;

query.addBindValue(ints);

QVariantList names;

names << "Harald" << "Boris" << "Trond" << QVariant(QVariant::String);

query.addBindValue(names);

if (!query.execBatch())

qDebug() << query.lastError();

UPDATE操作:

QSqlQuery query;

query.prepare("UPDATE employee SET salary = ? WHERE id = 1003");

query.bindValue(0, 70000);

query.exe();

DELETE操作:

QSqlQuery query;

query.exec("DELETE FROM employee WHERE id = 1007");

事务处理:

QSqlDatabase::database().transaction();

QSqlQuery query;

query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'");

if (query.next()) {

int employeeId = query.value(0).toInt();

query.exec("INSERT INTO project (id, name, ownerid) "

"VALUES (201, 'Manhattan Project', "

+ QString::number(employeeId) + ")");

}

QSqlDatabase::database().commit();

如果数据库引擎支持事务处理,则函数QSqlDriver::hasFeature(QSqlDriver::Transactions)将返回 真。

可以通过调用QSqlDatabase::transaction()来初始化一个事务处理。之后执行你想在该事务处理的工作。

完了再执行QSqlDatabase::commit()来提交事务处理或QSqlDatabase::rollback()取消事务处理。

这里在举个QSqlDriver::hasFeature(QSqlDriver::QuerySize)例子,可以较快的统计查询记录行数。

QSqlQuery query;

int numRows;

query.exec("SELECT name, salary FROM employee WHERE salary > 50000");

QSqlDatabase defaultDB = QSqlDatabase::database();

if (defaultDB.driver()->hasFeature(QSqlDriver::QuerySize)) {

numRows = query.size();

} else {

// this can be very slow

query.last();

numRows = query.at() + 1;

}

存储过程:

AsciiToInt()是数据库中的一个存储过程。

但我在网上以前好像看过说是SQL Server中的存储过程是通过"EXEC"完成的,而不是"CALL",这里我不确定!留下一个疑问吧~

QSqlQuery query;

query.prepare("CALL AsciiToInt(?, ?)");

query.bindValue(0, "A");

query.bindValue(1, 0, QSql::Out);

int rowNum = query.at();
        //获取query所指向的记录在结果集中的编号
        int columnNum = query.record().count();
//获取每条记录中属性(即列)的个数
        int fieldNo = query.record().indexOf("name");
//获取"name"属性所在列的编号,列从左向右编号,最左边的编号为0
        int id = query.value(0).toInt();
//获取id属性的值,并转换为int型
       QString name = query.value(fieldNo).toString();
//获取name属性的值

http://www.cnblogs.com/bennylam/archive/2010/03/30/1700761.html

QT操作数据库

2.完全解决数据库存储中文和Qt程式显示数据库中文及中文字符串的问题 
(1)数据库和表及表里的字符相关字段(varchar, char, text等)都要使用gbk_chinese_ci这种方式,不这样做也能,但这样做,会省非常多麻烦。 
(2)重新编译Qt的MySQL驱动,需要修改src / sql / drivers / mysql / qsql_mysql.cpp文件。要修改的部分如下:第一百零八行的codec函数   
static QTextCodec* codec(MYSQL* mysql) 

return QTextCodec::codecForName("GBK");//增加部分 
#if MYSQL_VERSION_ID >= 32321 
   QTextCodec* heuristicCodec = QTextCodec :: codecForName ( mysql_character_set_name ( mysql ) ); 
if (heuristicCodec) 
   return heuristicCodec; 
#endif 
return QTextCodec::codecForLocale(); 

(3)然后,重新编译qt的mysql驱动在Qt程式main函数中app后面开头处加入下面三句,加上这三个是省得不必要的麻烦   
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); 
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); 
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); 
(4)在Qt数据库连接后,运行"SET NAMES ’UTF8’"语句或"SET NAMES ’GBK’"。   
db = QSqlDatabase::addDatabase("QMYSQL"); 
db.setHostName("localhost"); 
db.setDatabaseName("yourdatabase"); 
db.setUserName("yourusername"); 
db.setPassword("yourpassword"); 
db.open(); 
db.exec("SET NAMES ’UTF8’"); 

经过以上四步,就能在Qt程式中直接使用中文字符串,而且能直接使用中文字符串出入于程式和数据库之间 
3.连接MySql数据库 
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 
db.setHostName("localhost"); 
db.setDatabaseName("test"); 
db.setUserName("root"); 
db.setPassword("******"); 
bool ok = db.open();

链接QSLite数据库:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
4.SELECT操作 
QSqlQuery query; 
int numRows; 
query.exec("SELECT * FROM scores ORDER BY id ASC"); 
while (query.next()) 

QString name = query.value(0).toString();//query.value()的参数只能是index 
int salary = query.value(1).toInt(); 
label = setText(QString::number(salary)+name);//测试查询数据的行数 
if (db.driver()->hasFeature(QSqlDriver::QuerySize)) 

   numRows = query.size(); 

else 

   // this can be very slow 
   query.last(); 
   numRows = query.at() + 1; 


5.INSERT操作 
(1)直接插入(一条记录) 
QSqlQuery query; 
query.exec("INSERT INTO employee (id, name, salary) VALUES (1001, ’Thad Beaumont’, 65000)"); 
(2)通过“:字段”操作 
QSqlQuery query; 
query.prepare("INSERT INTO employee (id, name, salary) VALUES (:id, :name, :salary)"); 
query.bindValue(":id", 1001); 
query.bindValue(":name", "Thad Beaumont"); 
query.bindValue(":salary", 65000); 
query.exec(); 
(3)通过“?”操作 
QSqlQuery query; 
query.prepare("INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)"); 
query.addBindValue(1001); 
query.addBindValue("Thad Beaumont"); 
query.addBindValue(65000); 
query.exec(); 
6.UPDATE操作
 
QSqlQuery query; 
query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003"); 
7.DELETE操作
 
QSqlQuery query; 
query.exec("DELETE FROM employee WHERE id = 1007"); 
8.transaction()操作 
有时为了执行一系列复杂的操作,使用QSqlDatabase::transaction()能加快速度 
//database为QSqlDatabase对象 
if(database.driver()->hasFeature(QSqlDriver::Transactions)) //测试数据库是否支持Transactions, 

database.transaction(); 
query.exec("SELECT name FROM scores WHERE id=19"); 
if(query.next()) 

      //str = query.value(0).toString(); 
      str = "中国"; 
      query.exec("INSERT INTO scores(name) VALUES(’"+str+"’)"); 

database.commit(); 

注意,如果str为中文字符串,在SQL语句中需要标明’str’(用单引号括起),如果是英文或数字字符串,能不加单引号(指的是包含在双引号内的SQL语句) 
9.使用SQL Model类 
QSqlQueryModel——一个只读的读取数据库数据的模型 
QSqlTableModel——一个可读写的单一表格模型,能不用写SQL语句 
QSqlRelationalTableModel——QSqlTableModel的一个子类 
这些类都继承于QAbstractTableModel,而他们又都继承于QAbstractItemModel 
(1) QSqlQueryModel的使用
 
QSqlQueryModel querymodel; 
querymodel.setQuery("SELECT * FROM scores ORDER BY id ASC"); 
for (num=0;numquerymodel.rowCount();num++) 

str += QString::number(querymodel.record(num).value("id").toInt()); 
str += " "; 
str += querymodel.record(num).value("name").toString(); 
//注意这里的value()参数能是index(索引)也能是字段名,前面QSqlQuery的value()参数只能是index 
str += "\n"; 

label->setText(str); 
(2) QSqlTableModel的使用 
① 读取数据
 
QSqlTableModel tablemodel;

tablemodel.setTable("scores"); 
tablemodel.setFilter("id > 10"); 
tablemodel.setSort(0,Qt::DescendingOrder); 
tablemodel.select(); 
for (num=0;numtablemodel.rowCount();num++) 

str += QString::number(tablemodel.record(num).value("id").toInt()); 
str += " "; 
str += tablemodel.record(num).value(1).toString(); 
str += "\n"; 

label->setText(str); 
② 修改数据 
QSqlTableModel tablemodel; 
tablemodel.setTable("scores"); 
tablemodel.setFilter("id > 10"); 
tablemodel.setSort(0,Qt::DescendingOrder); 
tablemodel.select(); 
for (num=0;numtablemodel.rowCount();num++) 

QSqlRecord record = tablemodel.record(num); 
record.setValue("name",record.value("name").toString()+"2"); 
tablemodel.setRecord(num,record);
 

if(tablemodel.submitAll()) 
label->setText("修改成功!"); 
else 
label->setText("修改失败!"); 
或能用setData()来修改,代码如下: 
QSqlTableModel tablemodel; 
tablemodel.setTable("scores"); 
tablemodel.setFilter("id > 10"); 
tablemodel.setSort(0,Qt::DescendingOrder); 
tablemodel.select(); 
tablemodel.setData(tablemodel.index(2,1),"data修改"); 
if(tablemodel.submitAll()) 
    label->setText("修改成功!"); 
else 
    label->setText("修改失败!"); 
③ 删除数据 
tablemodel.removeRows(row, 5);
 
//removeRows()第一个参数为要删除的第一行的行数,第二个参数为要删除的总行数; 
tablemodel.submitAll(); 
//注意,利用QSqlTableModel修改或删除数据,最后都要使用submitAll()执行更改 
④ 插入数据
 
QSqlRecord record = tablemodel.record(); 
record.setValue("name","插入的"); 
tablemodel.insertRecord(2,record);
 
//注意,此处插入利用insertRecord()函数,该函数第一个参数为插入到tablemodel的第几行,第二个参数为记录,注意这里的记录一 定要和tablemodel中的记录匹配,故QSqlRecord record = tablemodel.record();另外,插入操作不用submitAll(),因为,insertRecord()返回bool值。 
10.使用QTableView 
开头处要使用#include 
QTableView *view = new QTableView(); 
view->setModel(&model); 
view->setEditTriggers(QAbstractItemView::NoEditTriggers); 
view->show();

QT QSqlQuery QSqlQueryModel的更多相关文章

  1. qt QSqlQuery

    QT数据库QSqlQuery   SQL执行操作 QSqlQuery提供了对数据库记录的Select.Insert.Update.Delete操作. SELECT操作: QSqlQuery query ...

  2. 初学Qt——QTableView+QSqlqueryModel

    我们在显示报表时可以用到上面两个类来实现,QTableView负责对视图显示:QSqlqueryModel则负责数据模块. 这里数据查询使用QSqlqueryModel主要是这个类可以通过自己写的查询 ...

  3. 将vim作为QT开发的IDE

    转载请注明链接与作者huihui1988 用了一段时间的vim,喜欢上了这种简洁高效的编辑器.恰逢正在学习QT中,于是将vim变成了开发QT的工具.以下是具体配置. 一.语法高亮支持: 1.打开VIM ...

  4. qt 5.2.1类和模块的关系图

    QT│  ├─ActiveQt│  │  ActiveQt│  │  ActiveQtDepends│  │  ActiveQtVersion│  │  QAxAggregated│  │  QAxB ...

  5. qt中使用sqlite存储数据

    一.sqilte的安装 在Windows上安装SQLite: 请访问 SQLite 下载页面,从 Windows 区下载预编译的二进制文件. 您需要下载 sqlite-tools-win32-*.zi ...

  6. Qt数据库 QSqlTableModel实例操作(转)

    本文介绍的是Qt数据库 QSqlTableModel实例操作,详细操作请先来看内容.与上篇内容衔接着,不顾本文也有关于上篇内容的链接. Qt数据库 QSqlTableModel实例操作是本文所介绍的内 ...

  7. Qt4与Qt3的主要不同

    Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...

  8. Qt:QSqlQuery

    0.说明 QSqlQuery提供了执行SQL代码的方法. QSqlQuery封装了在QSqlDatabase中查询.检索数据的相关函数.它可以用来执行如SELECT.INSERT.UPDATE.DEL ...

  9. QT基本使用

    安装方法: ubuntu12.04下安装QT方法:http://blog.csdn.net/xsl1990/article/details/8299756 输入以下命令: sudo apt-get i ...

随机推荐

  1. springmvc工作流程

    Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...

  2. ActionBar官方教程(4)给ActionBar添加操作项及它们的事件处理

    Adding Action Items The action bar provides users access to the most important action items relating ...

  3. hdu4669Mutiples on a circle

    http://acm.hdu.edu.cn/showproblem.php?pid=4669 这题各种错误都来了一遍  预处理一下第一个数作为尾数与相邻前面的数组成的数的余数  然后再与后面的结合求余 ...

  4. 注意!ASP.NET MVC 3 的一个 OutputCache 问题

    在用 ASP.NET MVC 3 重写博客园网站首页时,特地留意了一下这个缓存问题,通过这篇博文分享一下. 在 ASP.NET MVC 3 中如果使用了 OutputCache,一定要在 Action ...

  5. 两种应该掌握的排序方法--------1.shell Sort

    先了解下什么都有什么排序算法 https://en.wikipedia.org/wiki/Sorting_algorithm http://zh.wikipedia.org/zh/%E6%8E%92% ...

  6. .Net 提交页面,js修改的Label值会丢掉

    <head id="Head1" runat="server"> <script src="../Jquery/jquery-1.1 ...

  7. nginx根据域名做http,https分发

    omcat端口:8080 做好虚拟主机 参照我的另一篇文章nginx端口:80 根据域名分派 在conf/nginx.conf中的http中增加 include www.huozhe.com.conf ...

  8. 用友U8账套的建立

      第1步点击开始菜单进入系统管理模块   第2步点击系统菜单下的注册   第3步弹出登录系统对话框,操作员输入admin点确定   第4步点击权限菜单下的用户   第5步进入用户管理窗口,点击工具栏 ...

  9. FFT矩阵

    举个例子: \[{F_4}=\left[{\begin{array}{*{20}{c}}1&1&1&1\\1&i&{-1}&{-i}\\1&{- ...

  10. 搭建hdfs服务器集群的搭建+trash

    完全分布式搭建需要三台机器:node1.node2和node3 搭建时间之前首先要保持时间一致:date ntpdateyum install ntpdatentpdate -u ntp.sjtu.e ...