QT QSqlQuery QSqlQueryModel

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

时间: 2024-11-10 16:51:03

QT QSqlQuery QSqlQueryModel的相关文章

qt QSqlQuery

QT数据库QSqlQuery   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 s

将vim作为QT开发的IDE

转载请注明链接与作者huihui1988 用了一段时间的vim,喜欢上了这种简洁高效的编辑器.恰逢正在学习QT中,于是将vim变成了开发QT的工具.以下是具体配置. 一.语法高亮支持: 1.打开VIMDIR/vim72/syntax/cpp.vim,加入 syn keyword cppStatement SLOT,SIGNAL syn keyword cppAccess slots,signals 2.增加QT的类型名: syn keyword cType ActiveQt Q3Accel Q3

Qt4与Qt3的主要不同

1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这些新的控件使用了新的方法.属性.和事件名称,虽然是比以前更规范了,但是对于升级旧代码来说,则增加了大量工作. 2)既然要更新控件,那么你就需要使用QDesigner工具来重新画界面了,OK,重画只是纯体力劳动,好说.界 面画好后,使用uic来根据界面生成代码文件,QT3的uic可以自动生成.h和.cpp文件,假设你在制作一个

[Qt教程] 第24篇 数据库(四)SQL查询模型QSqlQueryModel

导语在上一篇的最后我们讲到,Qt中使用了自己的机制来避免使用SQL语句,为我们提供了更简单的数据库操作及数据显示模型,分别是只读的QSqlQueryModel,操作单表的QSqlTableModel和以及可以支持外键的QSqlRelationalTableModel.这次我们先讲解QSqlQueryModel. 环境:Windows Xp + Qt 4.8.4+Qt Creator2.6.2 目录一.简单的查询操作二.QSqlQueryModel常用操作三.创建自定义QSqlQueryModel

Modle/View/Delegate框架+QSqlQuery类实现QT和MYSQL交互

2020的春节,武汉的疫情让我安心在家学QT,很喜欢https://www.devbean.net/category/qt-study-road-2/文章,深入浅出,很接地气.虽然也存在一些问题,但觉得值得初学者一读. QT库一个很庞大的系统,由于时间和精力有限,不能系统的分门别类的总结相关知识点,概念及常规应用,这里先留下一些粗浅认识,做一个结点吧,后续结合具体案例来完善补充. 前前后后,看了不少例子,由几个应用主题为切入点,简单罗列下,具体操作可以查书. 1.模型视图框架( Modle/Vi

关于QT中QSqlQuery类一些函数的笔记

1 QSqlQuery::next() 从数据库的开头一直往下找,如果某一行存了数据则返回1,如果是1个空行,则返回02 QSqlQuery::value(0) 如果存入数据库的数据是00 11 11 11 11 则打印出来的是QVariant(QString, "00111111") 转成字符串类型 QSqlQuery::value(0).toString()则打印出来的结果为 00 11 11 11 113 QSqlQuery::value(1).toString() 打印出来的则

【转】Qt数据库总结

转自:http://blog.chinaunix.net/uid-25201977-id-3014100.html #include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一:QSqlDatabase类QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  采用QSQLITE数据库,QMYS

Qt数据库sqlite总结

QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录QSqlRelationalTableModelQSqlQueryModelQSqlTableModel 第一:QSqlDatabase类 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  采用QSQLITE数据库 db.setHostName("localhost"); //设

Qt SQL Programming 部分翻译

简介: Qt SQL 是 Qt 的重要模块之一,为了方便,Qt 对 SQL 进行了一系列的封装,并将 SQL API 分为如下三层: (1)驱动层 (2)SQL API 层 (3)用户接口层 目录: 一.使用前提 二.数据库类 三.连接到数据库 · SQL 数据库驱动 四.执行 SQL 语句 · Qt 支持的数据库系统的数据类型 五.使用 SQL Model 类 一.使用前提: (1)在C++文件中加入相应头文件 #include <QtSql> (2)在Qt 工程文件中加入Qt SQL 模块