zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    grep 命令操作
    vi & vim复制,粘贴,剪切文本
    β版本第四次冲刺
    β版本第三次冲刺
    β版本第二次冲刺
    β版本第一次冲刺
    华为软件开发云,个人评测及体会
    事后诸葛亮
    【Alpha】团队课程展示
    团队Alpha博客链接目录
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/9215866.html
Copyright © 2011-2022 走看看