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数据库的连接的更多相关文章

  1. T-SQL 关闭数据库所有连接

    原文引用自: http://www.cnblogs.com/kissazi2/p/3462202.html 下面给出一种删除数据库活动连接的方式.将下面代码段中的"--修改一下"处 ...

  2. php判断数据库是否连接成功的测试例子

    php判断数据库是否连接成功的测试例子 如果出现数据库配置不正确的错误,请看php与mysql的配置教程: win7系统下如何配置php-Apache-mysql环境 http://www.cnblo ...

  3. java中与数据库的连接

    package unitl01; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet; ...

  4. jsp与数据库的连接

    经过一段时间的学习与上网查资料,我已经成功的用java语言连接上了数据库, 本以为同理jsp跟数据库的连接肯定水到渠成的,但是在经过尝试很多次后我发现现实永远是骨感的,最终结果是花了一个下午的时间去建 ...

  5. 数据库最大连接池max pool size

    本文导读:Max Pool Size如果未设置则默认为100,理论最大值为32767.最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影 ...

  6. jsp_数据库的连接

    一.添加数据库以及表 在这里我们使用的是mysql数据库 二.配置数据库的驱动程序 将mysql的驱动程序复制到Tomcat目录下的lib目录中 注:在Tomcat中如果配置了新的jar包,则配置完成 ...

  7. [转]Hibernate不能自动建表解决办法及Hibernate不同数据库的连接及SQL方言

    最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...

  8. MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作

    MVC模式(Model View Controller): Model:DAO模型 View:JSP  在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...

  9. MVC设计模式下实现数据库的连接,并获取所有数据到浏览器页面上显示

    实现建立一个学生的java类:里面封装了属性的全部属性: public class Student { private int id; private String username; private ...

随机推荐

  1. PHP-006

    Q:应用程序执行时的路径 "D:\*******\protected\runtime" 是无效的. 请确定它是一个可被 Web server process 写入资料的目录. A: ...

  2. ftplib模块【python】

    转自:http://www.cnblogs.com/kaituorensheng/p/4480512.html 函数释义 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实 ...

  3. isdigit()

    isdigit() 是字符串的一个方法,用来判断这个字符串是否是纯数字的字符串 In [1]: str = 'hello' In [2]: str.isdigit() Out[2]: False In ...

  4. poj_3468 伸展树

    题目大意 一个数列,每次操作可以是将某区间数字都加上一个相同的整数,也可以是询问一个区间中所有数字的和.(这里区间指的是数列中连续的若干个数)对每次询问给出结果. 思路 1. 伸展树的一般规律 对于区 ...

  5. Go基础---->go的基础学习(四)

    这里简单的介绍一下go中的关于多线程的知识. Go中的多线程 一.go中简单的并发例子 package main import ( "fmt" "time" ) ...

  6. web基础---->java邮件的发送

    这里记录一下关于java邮件发送代码的编写.你在我身边也好,在天边也罢,想到世界的角落有一个你,觉得整个世界也变得温柔安定了. java邮件的发送 一.直接贴出代码,如下: package com.c ...

  7. Android Graphviz 安装

    1. Windows下使用android ADT工具dmtracedump.exe绘图在windows下使用dmtracedump绘图时,出现如下错误: 'dot' 不是内部或外部命令,也不是可运行的 ...

  8. Android DatepickerDialog(日期选择器)的使用

    效果图如下: 日期和时间选择对话框,首先是要获得当前时间,这里用 java类中的Calendar来获得日期和时间(也可以用Date,但是不提倡,Date部分方法已经注释为过时), Calendar是一 ...

  9. ExecutorService的四种线程池

    转自:https://www.cnblogs.com/zhaoyan001/p/7049627.html 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new ...

  10. iOS - 初学iPad开发入门

    iPad是一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑MacBook产品之间跟iPhone一样,搭载的是iOS操作系统 iPhone和iPad开发的区别 屏幕的 ...