31Sql数据库的连接
Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作。这里我们所说的“平台独立”,既包括操作系统平台,有包括各个数据库平台。另外,我们强调了“基于 SQL”,因为 NoSQL 数据库至今没有一个通用查询方法,所以不可能提供一种通用的 NoSQL 数据库的操作。Qt 的数据库操作还可以很方便的与 model/view 架构进行整合。通常来说,我们对数据库的操作更多地在于对数据库表的操作,而这正是 model/view 架构的长项。
Qt 使用QSqlDatabase表示一个数据库连接。更底层上,Qt 使用驱动(drivers)来与不同的数据库 API 进行交互。Qt 桌面版本提供了如下几种驱动:
驱动 数据库
QDB2 IBM DB2 (7.1 或更新版本)
QIBASE Borland InterBase
QMYSQL MySQL
QOCI Oracle Call Interface Driver
QODBC Open Database Connectivity (ODBC) – Microsoft SQL Server 及其它兼容 ODBC 的数据库
QPSQL PostgreSQL (7.3 或更新版本)
QSQLITE2 SQLite 2
QSQLITE SQLite 3
QSYMSQL 针对 Symbian 平台的SQLite 3
QTDS Sybase Adaptive Server (自 Qt 4.7 起废除)
不过,由于受到协议的限制,Qt 开源版本并没有提供上面所有驱动的二进制版本,而仅仅以源代码的形式提供。通常,Qt 只默认搭载 QSqlite 驱动(这个驱动实际还包括 Sqlite 数据库,也就是说,如果需要使用 Sqlite 的话,只需要该驱动即可)。我们可以选择把这些驱动作为 Qt 的一部分进行编译,也可以当作插件编译。
在QT下使用数据库必须在.pro文件中添加此模块:QT +=sql
如果习惯于使用 SQL 语句,我们可以选择QSqlQuery类;如果只需要使用高层次的数据库接口(不关心 SQL 语法),我们可以选择使用QsqlTableModel类。
基本数据库头文件:
#include <QtSql/QSqlDatabase>
#include <QSqlError>
#include <QtSql/QSqlQuery>
在使用时,我们可以通过查询qt支持的数据库驱动:
qDebug()<<QSqlDatabase::drivers();
如:("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
//添加数据库
QSqlDatabase db=QSqlDatabase::addDatabase( "QMYSQL");
//连接数据库
db.setHostName("localhost"); //数据库服务器IP
//db.setHostName("127.0.0.1");
db.setUserName("root"); //数据库用户名
//db.setPassword("123456"); //密码
db.setDatabaseName("stu"); //使用哪个数据库
//打开数据库
if(!db.open())
{
qDebug()<<db.lastError();
return ;
}
重点:结果发现无法打开数据库。Qt无法加载MYSQL. QtSql 模块中的类大多具有lastError()函数,用于检查最新出现的错误。如果你发现数据库操作有任何问题,应该使用这个函数进行错误的检查。
错误:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
QSqlError("", "Driver not loaded", "Driver not loaded")
解决方式:
将MYSQL中bin文件夹下的名为“libmysql.dll”,复制到QT中bin文件夹中。
添加后,测试下能否打开数据库,并获取数据,语句如下:
//提供执行和查询的状态,用于数据操作
QSqlQuery query;
//查询数据库
query.exec("SELECT * FROM student;");
//查询数据库中的第一条数据
query.first();
qDebug()<<query.value("id").toInt();
<<query.value("sname").toString();
<<query.value("age").toString();
<<query.value("score").toInt();
结果显示:
QVariant(int, 8) QVariant(QString, "xiao") QVariant(int, 7) QVariant(int, 22)
数据库表:
可以看出已经成功接入数据库,并可以获取数据。
QsqlQuery类
提供了一个执行和查询的状态,该类封装了函数提取和检索数据的功能,它可以被用做数据操作语句,如:select,insert,update,selete,也可以作为数据定义语句,如:create table xxx;
QsqlQuery类似与链表的表头指针,可以获取下一结点next()或上一结点previous()或其他。。。
常用成员函数:
bool QSqlQuery::next()
bool QSqlQuery::previous()
bool QSqlQuery::first()
bool QSqlQuery::last()
bool QSqlQuery::seek(int index, bool relative = false)
For example:
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
}
注意点:
如何操作多个数据库?
函数原型:
QSqlDatabase QSqlDatabase::addDatabase(const QString & type, const QString & connectionName = QLatin1String( defaultConnection ))
第二参数是一个标识,可以自拟。
比如:在数据库中有两个数据库,database1,database2.
QSqlDatabase db1=QSqlDatabase::addDatabase( "QMYSQL");
QSqlDatabase db2=QSqlDatabase::addDatabase( "QMYSQL");
可以这么使用。但是自己又如何区别呢?可能在后面就忘记了db1,db2分别连接了哪个数据库。
改进:
QSqlDatabase db1=QSqlDatabase::addDatabase( "QMYSQL",“database1”);
QSqlDatabase db2=QSqlDatabase::addDatabase( "QMYSQL",“database2”);
第二个参数可以指定一个别名,作为标志。
那么,在执行操作时,一定要指定操纵哪个数据库。
QSqlQuery query(db1);
QSqlQuery query(db1);
不可以默认。QSqlQuery query;
源代码:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QtSql/QSqlDatabase>
#include <QSqlError>
#include <QtSql/QSqlQuery>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//查询qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
//添加数据库
QSqlDatabase db=QSqlDatabase::addDatabase( "QMYSQL");
//连接数据库
db.setHostName("localhost");
//db.setHostName("127.0.0.1");
db.setUserName("root");
//db.setPassword("123456");
db.setDatabaseName("stu");
//打开数据库
if(!db.open())
{
qDebug()<<db.lastError();
}
//提供执行和查询的状态,用于数据操作
QSqlQuery query;
//查询数据库
query.exec("SELECT * FROM student;");
//查询数据库中的第一天数据
query.first();
qDebug()<<query.value("id").toInt()
<<query.value("sname").toString()
<<query.value("age").toString()
<<query.value("score").toInt();
}
Widget::~Widget()
{
delete ui;
}
31Sql数据库的连接的更多相关文章
- T-SQL 关闭数据库所有连接
原文引用自: http://www.cnblogs.com/kissazi2/p/3462202.html 下面给出一种删除数据库活动连接的方式.将下面代码段中的"--修改一下"处 ...
- php判断数据库是否连接成功的测试例子
php判断数据库是否连接成功的测试例子 如果出现数据库配置不正确的错误,请看php与mysql的配置教程: win7系统下如何配置php-Apache-mysql环境 http://www.cnblo ...
- java中与数据库的连接
package unitl01; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet; ...
- jsp与数据库的连接
经过一段时间的学习与上网查资料,我已经成功的用java语言连接上了数据库, 本以为同理jsp跟数据库的连接肯定水到渠成的,但是在经过尝试很多次后我发现现实永远是骨感的,最终结果是花了一个下午的时间去建 ...
- 数据库最大连接池max pool size
本文导读:Max Pool Size如果未设置则默认为100,理论最大值为32767.最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影 ...
- jsp_数据库的连接
一.添加数据库以及表 在这里我们使用的是mysql数据库 二.配置数据库的驱动程序 将mysql的驱动程序复制到Tomcat目录下的lib目录中 注:在Tomcat中如果配置了新的jar包,则配置完成 ...
- [转]Hibernate不能自动建表解决办法及Hibernate不同数据库的连接及SQL方言
最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...
- MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作
MVC模式(Model View Controller): Model:DAO模型 View:JSP 在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...
- MVC设计模式下实现数据库的连接,并获取所有数据到浏览器页面上显示
实现建立一个学生的java类:里面封装了属性的全部属性: public class Student { private int id; private String username; private ...
随机推荐
- lua知识点整理
1. lua全局环境和局部环境 local cf = loadstring(" local i=0 i=i+1 print(i) ") --从后面两个输出我们可以看出,生成的函数的 ...
- JDBC--Result 获取返回集合
package jdbc.chap05; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql. ...
- C++虚继承的概念[转]
C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数 ...
- vux 全局注册组件
背景:调试better-scroll的时候进行封装,作为组件来调用: 希望:全局注册组件: 1,在src的main.js下: 这样就可以用了:
- Sublime Less 自动编译成css
1.note编译 .下载notejs https://nodejs.org/en/ .首先你要安装lessc.我是用npm包管理器直接安装的,只需要一条命令,如下: npm install less ...
- spring boot application.properties基本配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://loca ...
- jquery实现ajax跨域请求!亲测有效
在解决跨域的时候,我通常会用豆瓣api作为尝试. 下面是本地跨域请求豆瓣API:亲测有效: <script type="text/javascript"> var ur ...
- Linux系统下Redis缓存安装配置
Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Linux服务器上搭建Redis,怎么可以 ...
- python 对文件的操作
观看的技术文来源:http://www.cnblogs.com/alex3714/articles/5717620.htmlimport sys# data = open("yesterda ...
- 前端模拟(mock)接口数据(koa)
在前后端分离开发项目时,经常会有前后端进度不一致,可能前端界面开发已经完成,就等接口了,如果等接口出来再联调的话时间可能会来不及. 这个时候,前端就可以根据制定好的接口规范和接口文档来mock接口数据 ...