Qt5.6.0连接SQL Server 2008

本文将介绍如何在Qt中连SQL Server数据库,假设已经具有如下软件环境:

  • win7 64
  • VS 2013
  • Qt 5.6.0(32 msvc)
  • Qt add in 1.2.5
  • SQL Server 2008(32、64应该都可以)

数据库有关问题

  • 如何用sa(或者自己建立一个登录名)登录?

    新手教程使用设置sa用户登录sql server2008

    更改后重启服务器才能生效,在Sql Server Configuration Manager中重启SQL Server(MSSQLSERVER)服务。

    ip用localhost比较好,因为如果在不同的电脑上执行的话,可能ip不同,但是localhost却可以准确定位到ip。实现qt连接SQLserver实例

  • 如何设置DSN名?

    总的来说有两种方法:1.操作系统中配置DSN;2.在Qt程序中配置。

    Qt通过ODBC连接SQL Server2008实践总结这篇文章有说第1种方法。在操作系统中配置DSN的时候,服务器是LN7XVE8H9DDB5A3(我电脑的名字,可以在sql server中local右键属性查看),hostname用的“local”。第2种,可以直接看后面我给的示例代码。

创建数据库、表相差问题

远程连接数据库

  • 本地接连和远程连接的区别

    SQL Server 2008本身就是网络数据库,不管是访问本地还是远程访问,区别只是服务器不同,如果是远程连接需要检查远程连接是否打开:
    SQL Server 2008 R2如何开启数据库的远程连接

  • 没有SQL Server的驱动

    如果qt中没有SQL Server的驱动请参考:Qt5.6.0(32位)编译SQLServer驱动(ODBC)(vs2013)

  • 从外网访问局域网里的数据库

    这个比较麻烦,要知道局域网是没有公网的IP的,访问者和数据库同在一个局域网可以轻松访问。如果想从外网访问局域网里的数据库,需要端口映射,花生壳有这个功能,我试了一下但是没有成功。

示例code

如果要让代码运行成功,在运行代码前需要在SQL Server 2008中新建一个数据库,这里取名为testdb,在该数据库中新建一张表,取名为Table_1,在该表中有三个字段:apple,beer,tree,均为float型,不为null。

附上一段示例代码(完整工程在这里):

//测试SQLServer

#include <QtCore/QCoreApplication>
#include <QtSql/qsql.h>
#include <QtSql/qsqldatabase.h>
#include <QtSql/qsqlquery.h>
#include <QtSql/qsqlerror.h>
#include <QtSql/qsqltablemodel.h>
#include <qstring.h>
#include <qfile.h>
#include <qdebug.h>
#include <qvariant.h>
#include <qdatetime.h>
#include <qsqlrecord.h>


bool createConnection(QString driver, QString server, QString database, QString userName, QString passWord)
{
    QSqlDatabase db = QSqlDatabase::addDatabase(driver);

    //方式1.在程序中配置DSN
    QString dsn = QString("Driver={SQL SERVER};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4").arg(server).arg(database).arg(userName).arg(passWord);//

    //方式2.使用"控制面板"-"管理工具"-"数据源(ODBC)"进行配置
    //QString dsn = QString::fromLocal8Bit("QTDSN");

    db.setDatabaseName(dsn);

    if (!db.open())
    {
        qDebug() << db.lastError();
        return false;
    }
    return true;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString driver   = "QODBC";             //驱动名
    QString server   = "LN7XVE8H9DDB5A3";   //SERVER=LN7XVE8H9DDB5A3(改成自己电脑名),或者SERVER=192.168.168.61(改成自己的IP)
    QString database = "testdb";            //数据库名
    QString userName = "sa";                //登录用户
    QString passWord = "123456";            //登录密码

    bool isConncet = createConnection(driver, server, database, userName, passWord); //连接数据库
    if (!isConncet)
    {
        return 1; //连接失败则返回1
    }

    //插入
    QSqlQuery insertQuery;
    insertQuery.prepare("INSERT INTO Table_1 (apple, beer, tree)"
        "VALUES (?, ?, ?)"); //ODBC风格

    insertQuery.addBindValue(12.3); // apple
    insertQuery.addBindValue(32.1); // beer
    insertQuery.addBindValue(34.45);// tree
    insertQuery.exec();

    //查找
    QSqlQuery selectQuery;
    selectQuery.exec("SELECT apple, beer FROM Table_1"); //sql查询语句
    while (selectQuery.next())
    {
        double apple = selectQuery.value(0).toDouble();
        double beer = selectQuery.value(1).toDouble();
        qDebug() << apple << " " << beer;
    }
    return a.exec();
}

可以看到程序向数据库中插入了一行数据,如果正常运行将会看到屏幕上输出12.3 32.1.

posted @ 2017-03-10 16:30  ssh_alitheia  阅读(417)  评论(0编辑  收藏  举报