对于习惯使用SQL语法的用户,QSqlQuery类提供了直接执行SQL语句并处理返回结果的方法。对于习惯使用较高层数据库接口避免使用SQL语句的用户,QSqlTableModel类和QSqlRelationalTableModel类则提供了合适的抽象。

 -->可视化操作数据库

 Qt 不仅提供了这种使用 SQL 语句的方式,还提供了一种基于模型的更高级的处理方式。这种基于QSqlTableModel 的模型处理更为高级,如果对 SQL 语句不熟悉,并且不需要很多复杂的查询,这种QSqlTableModel模型基本可以满足一般的需求。即使用可以不懂sql语句都可以操作的类,来操作数据库。

-----> 需要自己补充SQL语法等内容

 数据库连接由任意字符串标识。在没有指定连接的情况下,QSqlDatabase可以提供默认连接供Qt其他的SQL类使用。建立一条数据库连接的代码如下:

  1. //以QSQLITE为数据库类型,在本进程地址控件创建一个SQLite数据库
  2. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  3. db.setHostName("easybook-3313b0"); //设置数据库主机名
  4. db.setDatabaseName("qtDB.db"); //设置数据库名
  5. db.setUserName("zhouhejun"); //设置数据库用户名
  6. db.setPassword("123456"); //设置数据库密码
  7. db.open(); //打开连接

 静态函数QSqlDatabase::addDatabase()带有两个参数,第一个参数为驱动名,第二个参数为连接名,缺省值为默认连接。这个函数返回一条新建立的数据库连接。如果连接名connectionName没有指定,新建立的数据库连接将成为本程序的默认连接,并且可以被后续不带参数的函数database()引用。如果指定了连接名connectionName,函数database(connectionName)将获取这个数据库连接。

  1. static QSqlDatabase addDatabase(QSqlDriver* driver,
  2. const QString& connectionName = QLatin1String(defaultConnection));

DEMO

pro文件

  1. #-------------------------------------------------
  2. #
  3. # Project created by QtCreator 2018-10-18T11:24:48
  4. #
  5. #-------------------------------------------------
  6. QT += core gui
  7. QT += sql
  8. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  9. TARGET = CH1301
  10. TEMPLATE = app
  11. SOURCES += main.cpp\
  12. dialog.cpp
  13. HEADERS += dialog.h
  14. FORMS += dialog.ui

dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. #include <QString>
  5. #include <QSqlError>
  6. #include <QSqlDatabase>
  7. #include <QString>
  8. #include <QTime>
  9. #include <QSqlQuery>
  10. #include <QDebug>
  11. #include <QSqlRecord>
  12. namespace Ui {
  13. class Dialog;
  14. }
  15. class Dialog : public QDialog
  16. {
  17. Q_OBJECT
  18. public:
  19. explicit Dialog(QWidget *parent = 0);
  20. ~Dialog();
  21. QString driverName() const;
  22. QString databaseName() const;
  23. QString userName() const;
  24. QString password() const;
  25. QString hostName() const;
  26. int port() const;
  27. QSqlError addConnection(const QString &driver,const QString &dbName,
  28. const QString &host,const QString &user,
  29. const QString &passwd,int port = -1);
  30. void creatSqliteDB();
  31. private slots:
  32. void on_cancel_pushButton_clicked();
  33. void on_ok_pushButton_clicked();
  34. void driverChanged(const QString &text);
  35. private:
  36. Ui::Dialog *ui;
  37. };
  38. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :
  4. QDialog(parent),
  5. ui(new Ui::Dialog)
  6. {
  7. ui->setupUi(this);
  8. QStringList drivers = QSqlDatabase::drivers();
  9. ui->drivercomboBox->addItems(drivers);
  10. connect(ui->drivercomboBox,SIGNAL(currentIndexChanged(QString)),
  11. this,SLOT(driverChanged(QString)));
  12. ui->statuslabel->setText(tr("准备连接数据库!"));
  13. }
  14. Dialog::~Dialog()
  15. {
  16. delete ui;
  17. }
  18. void Dialog::driverChanged(const QString &text)
  19. {
  20. if(text == "QSQLITE")
  21. {
  22. ui->datebaselineEdit->setEnabled(false);
  23. ui->userNamelineEdit->setEnabled(false);
  24. ui->hostnamelineEdit->setEnabled(false);
  25. ui->passwordlineEdit->setEnabled(false);
  26. ui->portspinBox->setEnabled(false);
  27. }
  28. else
  29. {
  30. ui->datebaselineEdit->setEnabled(true);
  31. ui->userNamelineEdit->setEnabled(true);
  32. ui->hostnamelineEdit->setEnabled(true);
  33. ui->passwordlineEdit->setEnabled(true);
  34. ui->portspinBox->setEnabled(true);
  35. }
  36. }
  37. void Dialog::on_cancel_pushButton_clicked()
  38. {
  39. close();
  40. }
  41. QString Dialog::driverName() const
  42. {
  43. return ui->drivercomboBox->currentText();
  44. }
  45. QString Dialog::databaseName() const
  46. {
  47. return ui->datebaselineEdit->text();
  48. }
  49. QString Dialog::hostName() const
  50. {
  51. return ui->hostnamelineEdit->text();
  52. }
  53. QString Dialog::userName() const
  54. {
  55. return ui->userNamelineEdit->text();
  56. }
  57. QString Dialog::password() const
  58. {
  59. return ui->passwordlineEdit->text();
  60. }
  61. int Dialog::port() const
  62. {
  63. return ui->portspinBox->value();
  64. }
  65. QSqlError Dialog::addConnection(const QString &driver, const QString &dbName, const QString &host, const QString &user,
  66. const QString &passwd, int port)
  67. {
  68. static int cCount = 0;
  69. QSqlError err;
  70. QSqlDatabase db = QSqlDatabase::addDatabase(driver,QString("conn%1").arg(++cCount));
  71. db.setHostName(dbName);
  72. db.setDatabaseName(dbName);
  73. db.setPort(port);
  74. if(!db.open(user,passwd))
  75. {
  76. err = db.lastError();
  77. db = QSqlDatabase();
  78. QSqlDatabase::removeDatabase(QString("conn%1").arg(cCount));
  79. }
  80. return err;
  81. }
  82. /*
  83. * 描述:
  84. * 输入:
  85. * 输出:
  86. * 返回值:
  87. * 其他:
  88. */
  89. void Dialog::creatSqliteDB()
  90. {
  91. //以QSQLITE为数据库类型,在本进程地址控件创建一个SQLite数据库
  92. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  93. db.setHostName("easybook-3313b0"); //设置数据库主机名
  94. db.setDatabaseName("qtDB.db"); //设置数据库名
  95. db.setUserName("zhouhejun"); //设置数据库用户名
  96. db.setPassword("123456"); //设置数据库密码
  97. db.open(); //打开连接
  98. if(!db.open())
  99. {
  100. ui->statuslabel->setText(db.lastError().text());
  101. return ;
  102. }
  103. //创建数据库表
  104. QSqlQuery query;
  105. bool success=query.exec("create table automobil(id int primary key,attribute varchar,type varchar,kind varchar,nation int,carnumber int,elevaltor int,distance int,oil int,temperature int)");
  106. if(success)
  107. {
  108. qDebug() << "数据库创建成功!" << endl;
  109. }
  110. else
  111. {
  112. qDebug() << "数据库创建失败!" << endl;
  113. return ;
  114. }
  115. //查询
  116. query.exec("select * from automobil");
  117. QSqlRecord rec = query.record();
  118. qDebug() << "atuomobil 表字段数: " << rec.count();
  119. //插入记录
  120. QTime t; //启动一个定时器,统计操作耗时
  121. t.start();
  122. query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)");
  123. long records = 100; //向表中任意的插入100条记录
  124. for(int i = 0;i < records;i++)
  125. {
  126. query.bindValue(0,i);
  127. query.bindValue(1,"四轮");
  128. query.bindValue(2,"轿车");
  129. query.bindValue(3,"富康");
  130. query.bindValue(4,rand()%100);
  131. query.bindValue(5,rand()%10000);
  132. query.bindValue(6,rand()%300);
  133. query.bindValue(7,rand()%200000);
  134. query.bindValue(8,rand()%52);
  135. query.bindValue(9,rand()%100);
  136. success=query.exec();
  137. if(!success)
  138. {
  139. QSqlError lastError = query.lastError();
  140. qDebug() << lastError.driverText() << "插入失败" <<endl;
  141. }
  142. }
  143. qDebug() << QObject::tr("插入 %1 条记录,耗时 %2 ms").arg(records).arg(t.elapsed());
  144. //排序
  145. t.restart(); //重启计数器
  146. //按id字段的降序将查询表中刚刚插入的100条记录进行排序
  147. success = query.exec("select * from automobil order by id desc");
  148. if(success)
  149. {
  150. qDebug() << QObject::tr("排序 %1 条记录,耗时 %2 ms").arg(records).arg(t.elapsed());
  151. }
  152. else
  153. {
  154. qDebug() << "排序失败!\n";
  155. }
  156. //删除
  157. t.restart();
  158. query.exec("delete from automobil where id=15"); //执行删除id为15的记录的操作
  159. //输出耗时
  160. qDebug() << QObject::tr("删除一条记录,耗时 %1 ms").arg(t.elapsed());
  161. return ;
  162. }
  163. void Dialog::on_ok_pushButton_clicked()
  164. {
  165. if(ui->drivercomboBox->currentText().isEmpty())
  166. {
  167. ui->statuslabel->setText(tr("请选择一个数据库驱动"));
  168. }
  169. else if(ui->drivercomboBox->currentText() == "QSQLITE")
  170. {
  171. creatSqliteDB();
  172. // accept();
  173. }
  174. else
  175. {
  176. QSqlError err = addConnection(driverName(),databaseName(),hostName(),
  177. userName(),password(),port());
  178. if(err.type() != QSqlError::NoError)
  179. {
  180. ui->statuslabel->setText(err.text());
  181. }
  182. else
  183. {
  184. ui->statuslabel->setText(tr("连接数据库成功!"));
  185. // accept();
  186. }
  187. }
  188. }

main.cpp

  1. #include "dialog.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. Dialog w;
  7. w.show();
  8. return a.exec();
  9. }

参考资料

1 https://www.cnblogs.com/yuweifeng/p/9403696.html

Qt5数据库的更多相关文章

  1. QT5 - 数据库、QMYSQL driver not loaded

    第一步.先在“.pro”的入口文件里加入以下两行代码: QT += sql SOURCES += main.cpp 第二步.在“main.cpp”文件中连接数据库并判断是否连接成功 1.QPSQL连接 ...

  2. JSP应用开发 -------- 电纸书(未完待续)

    http://www.educity.cn/jiaocheng/j9415.html JSP程序员常用的技术   第1章 JSP及其相关技术导航 [本章专家知识导学] JSP是一种编程语言,也是一种动 ...

  3. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

    作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...

  4. CentOS7 (64位) 下QT5.5 连接MySQL数据库(driver not loaded)

    用qt连接MySQL需要共享库 libqsqlmysql.so的驱动,路径在plugin/sqldrivers目录下,乍看已经可用了,其实不然. 用ldd命令分析一下,libmysqlclient_r ...

  5. Linux系统下 解决Qt5无法连接MySQL数据库的方法

    Linux平台下解决Qt5连接mysql数据库的问题:输入sudo apt-get install libqt5sql5-mysql解决,这种方法只能解决Qt是用sudo apt-get instal ...

  6. 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码

    VS2012默认格式为 "GB2312-80",而有时我们用到字符串需要显示中文时,就会出现乱码.下面仅就Qt5和VS2012中使用数据库SQLite时,做一个简单的备忘录 #in ...

  7. Qt5.8以上版本编译Oracle数据库的OCI驱动教程

    在前一篇的文章中我已经发过一个相似的文章,详情请点击:Qt5编译oracle驱动教程. 在那一篇文章中已经可以解决了Qt5的常用版本的Oracle数据库驱动的支持,但是在新的Qt开发工具中那种方法竟然 ...

  8. qt5.6.2简单操作mysql数据库

    1.新建个项目后,需要在.pro工程文件在中添加QT += sql,否则编译会出错: 2.如果出现数据库驱动未加载,则需要把mysql下的libmysql.dll拷贝到D:\Qt5.6.2\5.6\m ...

  9. Ubuntu 15.04 Qt5 链接 mysql数据库

    序 最近在Ubuntu15.04下做一个Linux-服务器-客户端通信项目,用到MySQL数据库.开始的时候,在数据库链接时遇到障碍,查找资料解决. 特此记录,分享于此. 环境配置 系统:Ubuntu ...

随机推荐

  1. jquery的$post方法不发送空数组的解决办法

    问题:jquery里的ajax在提交post请求时,如果数据里有一个空数组,则这个空数组不会提交上去 技术上的解决办法如下: 源代码: var params = { type : , ids:[] } ...

  2. vue.JS 介绍

    vueJS 介绍 首先,vueJS 是我很早之前就想要接触学习的东西,但是呢,一直没时间,主要是在学校,事太多,没心思定下心来学习,我学生生涯的最后一个假期的第一天晚上,万事开头难,那就先写点儿什么东 ...

  3. 14: element ui 使用

    1.1 element ui 基本使用 参考网址: http://element.eleme.io/#/zh-CN/component/button 1.初始一个vue项目并安装element ui ...

  4. win-Linux文件脚本迁移过程中的问题 syntax error: unexpected end of file

    问题:  在win下写好的shell脚本,放到Linux上测试sh -n报错如下 ORA_check.sh: line 251: syntax error: unexpected end of fil ...

  5. Python3 tkinter基础 Checkbutton anchor for生成多个控件并西对齐

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. 快速自动安装dart

    @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat Non ...

  7. Master of GCD 【线段树区间更新 || 差分】

    Master of GCD 时间限制: 1 Sec  内存限制: 128 MB 提交: 670  解决: 112 [提交] [状态] [命题人:admin] 题目描述 Hakase has n num ...

  8. tp框架中的一些疑点知识-5

    关于vim中的缓存区的前后bp和bn的界定 通过命令ls可以看到 缓存区的 排序. 最开始打开的文件排在最上面, 序号最小. 那么它们就是 更 前 的缓冲区. 序号更前的用bp, 序号靠后的用bn. ...

  9. resure挽救笔记本系统和一些相关的操作记录

    使用fedora23很久了, 但是感觉不是很流畅, 出现了一些不太稳定的体验, 所以想改到centos7. 因为centos7的很多东西 跟 fedora23 很相近了. 所以应该是无缝过渡 是选择3 ...

  10. javascript中的高阶函数, 和 类定义Function, 和apply的使用

    参考: http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html js中的类, 也是用function关键字来定义的: function ...