公司领导说要跟一个医院对接数据库,我这就去了解了SQL Server 2008 r2,其实上学的时候学过,不过学的是一些基本操作。这次试一试用Qt远程连接。

翻了2天,终于可以用qt上位机连接同局域网下的另一台电脑内的数据库。把过程做个博客记录一下。

第一步肯定就是安装SQL Server 2008 r2。这个网上教程一大堆,但是我并不推荐,推荐直接用官网上的安装包,网上的都太大了。

官网连接:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=23650 我用这个安装包安装并没有用到激活码啥的,还是不错的。

下载完成后运行,最好先在电脑整理一个磁盘,用于存放SQL Server 2008 r2。

Qt远程连接SQL Server 2008 r2

 

 选择安装,进入安装程序页面。

Qt远程连接SQL Server 2008 r2

 

 点击安装,

Qt远程连接SQL Server 2008 r2

 

 接受许可条款,下一步。

Qt远程连接SQL Server 2008 r2

 

点击全选, 更改目录,只需更改放在哪个盘即可,后面的文件夹不用改。点击下一步。

Qt远程连接SQL Server 2008 r2

 

 把实例根目录也改了,下一步。

Qt远程连接SQL Server 2008 r2

 

 这两个服务的启动类型设置为自动。下一步

Qt远程连接SQL Server 2008 r2

 

 选择混合模式,设置密码,添加当前用户,我这里已经把电脑的登陆用户加进去了,下一步,再下一步,进入安装页面

Qt远程连接SQL Server 2008 r2

 

 等待安装完成。点击关闭即可

Qt远程连接SQL Server 2008 r2

 

 运行刚刚安装的SQL Server Management Studio

进入连接页面:

Qt远程连接SQL Server 2008 r2

 

 服务器名称选择 local也就是本机,身份验证选择SQL Server身份验证,登录名sa,密码为刚刚安装时设置的密码。点击连接即可。

现在创建一个数据库

Qt远程连接SQL Server 2008 r2

 

点击新建查询,输入以下代码:

CREATE DATABASE Bank;

点击执行,然后删除以上,再输入以下代码

use Bank;
CREATE TABLE Card
( Account INT PRIMARY KEY,
  Pwd VARCHAR(12) NOT NULL,
  Balance INT CHECK(Balance>=0)
 )

 CREATE TABLE Record
 ( Account INT FOREIGN KEY(Account) REFERENCES Card(Account),
   Rmoney INT,
   Rtime DATETIME NOT NULL DEFAULT GETDATE()
  )

  INSERT INTO Card VALUES(123456,123456,100000);
  INSERT INTO Record (Account,Rmoney) VALUES (123456,-100);

点击执行,执行成功后点击刷新,即可看到刚刚创建的数据库Bank。

 Qt远程连接SQL Server 2008 r2

 

 接下来就可以开始远程连接了,开始之前先确保两个:

一:服务器允许远程连接,右键点击已连接的服务器,选择'属性',点击左侧‘连接’

Qt远程连接SQL Server 2008 r2

 

 二:打开SQL Server配置管理器,选择SQL Server 网络配置 - MSSQLSERVER的协议,右键TCP/IP,选择启用

Qt远程连接SQL Server 2008 r2

 

 然后重启服务即可

下一步是关闭电脑防火墙,当然了,最优做法是在防火墙上为SQL Server创建规则,我这里,懒人做法啦。

把这台电脑当做服务器。

然后找另一台和这台服务器在同一局域网下的电脑开始连接测试。

使用ODBC建立数据源,直接在电脑上搜索ODBC即可。打开之后,点击 添加 

Qt远程连接SQL Server 2008 r2

 

 

 选择 SQLServer  点击确定

Qt远程连接SQL Server 2008 r2

 

 

 Qt远程连接SQL Server 2008 r2

 

 

 填写名称和描述,名称等下程序里要用,描述随便写。服务器选择刚刚安装SQL Server 2008并创建数据库的电脑的IP地址或者电脑名,点击下一步

Qt远程连接SQL Server 2008 r2

 

 

 选择 使用用户输入登陆ID和密码的SQL Server验证,然后输入登陆ID和密码,也就是服务器电脑数据库的ID和密码(安装时设置的)。点击下一步。

Qt远程连接SQL Server 2008 r2

 

 

 勾选 更改默认的数据库为   ,然后在下拉列表中选择刚刚在服务器中创建的数据库,我这里是Bank。点击下一步

再直接点击完成,再点击 测试数据库连接  直到出现

Qt远程连接SQL Server 2008 r2

 

 

 说明ODBC数据源创建成功。可以开始下一步了。

然后写代码进行测试,新建Qt Widgets应用程序,然后修改main.cpp为

#include "mainwindow.h"
#include <QApplication>
#include<QSql>
#include <QDialog>
#include <QDebug>
#include <QMessageBox>
#include<QSqlError>
#include<QSqlDatabase>
#include<QSqlQuery>

bool OpenDatabase()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");   //数据库驱动类型为SQL Server
    qDebug()<<"ODBC driver?"<<db.isValid();
    QString dsn = QString::fromLocal8Bit("tianSQLServer");      //数据源名称   刚刚创建的数据源的名称
    db.setHostName("Yct201909041134");                        //选择IP地址,也就是服务器的IP地址或者电脑名
    db.setDatabaseName(dsn);                            //设置数据源名称
    db.setUserName("sa");                               //登录用户  创建数据源时输入大的用户名和密码
    db.setPassword("tian");                              //密码  
    if(!db.open())                                      //打开数据库
    {
        qDebug()<<db.lastError().text();
        QMessageBox::critical(0, QObject::tr("Database error"), db.lastError().text());
        return false;                                   //打开失败
    }
    else
    {
        qDebug()<<"database open success!";
        QSqlQuery query(db); //查询Card表并输出,测试能否正常操作数据库
        query.exec("SELECT * FROM Card");
        while(query.next())
        {
            qDebug()<<query.value(0).toInt() <<query.value(1).toString() <<query.value(2).toInt();
        }

    }return true;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    if(!OpenDatabase())
        return 1;

    w.show();
    return a.exec();
}

运行程序可以在控制台看到输出

Qt远程连接SQL Server 2008 r2

 

 

下面还有一个不需要创建ODBC数据源即可远程连接SQL Server数据库的方法。

//网络数据库SQL访问
/***************************************************************************
 * 函数名:openSQLServer
 * 参数1:ip 数据库服务器IP
 * 参数2:dbName 数据库名称
 * 参数3:userName 用户名
 * 参数4:passwd   密码
 * 返回 true 打开数据库成功
 * ************************************************************************/
bool MainWindow::openSQLServer(const QString ip,const QString dbName,const QString userName,const QString passwd)
{
       db = QSqlDatabase::addDatabase("QODBC");  //数据库驱动类型为SQL Server
       qDebug()<<"ODBC driver?"<<db.isValid();
       QString dsn = QString("DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2").arg(ip).arg(dbName);
       db.setDatabaseName(dsn);
       db.setUserName(userName);                        //登录用户
       db.setPassword(passwd);                          //密码
       if(!db.open())                                   //打开数据库
       {
           qDebug()<<db.lastError().text();
           QMessageBox::critical(0, QObject::tr("Database error"), db.lastError().text());
           return false;                                   //打开失败
       }
       else
       {
           qDebug()<<"database open success!";
           QMessageBox::critical(0, QObject::tr("Database ok"),"数据库打开成功");
           QSqlQuery query(db); //查询Card表并输出,测试能否正常操作数据库
           query.exec("select * from [Bank].[dbo].[Card]");
           while(query.next())
           {
               qDebug()<<query.value(0).toString()  <<query.value(1).toString() <<query.value(2).toString();
           }

       }
       return true;
}

说明:此代码里的参数dbName是数据库名,也就是服务器中创建的数据库的名字,像我这里就是Bank,可以做一下修改,移植到刚刚的代码里看效果。

 

相关文章: