公司领导说要跟一个医院对接数据库,我这就去了解了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。
选择安装,进入安装程序页面。
点击安装,
接受许可条款,下一步。
点击全选, 更改目录,只需更改放在哪个盘即可,后面的文件夹不用改。点击下一步。
把实例根目录也改了,下一步。
这两个服务的启动类型设置为自动。下一步
选择混合模式,设置密码,添加当前用户,我这里已经把电脑的登陆用户加进去了,下一步,再下一步,进入安装页面
等待安装完成。点击关闭即可
运行刚刚安装的SQL Server Management Studio
进入连接页面:
服务器名称选择 local也就是本机,身份验证选择SQL Server身份验证,登录名sa,密码为刚刚安装时设置的密码。点击连接即可。
现在创建一个数据库
点击新建查询,输入以下代码:
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。
接下来就可以开始远程连接了,开始之前先确保两个:
一:服务器允许远程连接,右键点击已连接的服务器,选择'属性',点击左侧‘连接’
二:打开SQL Server配置管理器,选择SQL Server 网络配置 - MSSQLSERVER的协议,右键TCP/IP,选择启用
然后重启服务即可
下一步是关闭电脑防火墙,当然了,最优做法是在防火墙上为SQL Server创建规则,我这里,懒人做法啦。
把这台电脑当做服务器。
然后找另一台和这台服务器在同一局域网下的电脑开始连接测试。
使用ODBC建立数据源,直接在电脑上搜索ODBC即可。打开之后,点击 添加
选择 SQLServer 点击确定
填写名称和描述,名称等下程序里要用,描述随便写。服务器选择刚刚安装SQL Server 2008并创建数据库的电脑的IP地址或者电脑名,点击下一步
选择 使用用户输入登陆ID和密码的SQL Server验证,然后输入登陆ID和密码,也就是服务器电脑数据库的ID和密码(安装时设置的)。点击下一步。
勾选 更改默认的数据库为 ,然后在下拉列表中选择刚刚在服务器中创建的数据库,我这里是Bank。点击下一步
再直接点击完成,再点击 测试数据库连接 直到出现
说明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(); }
运行程序可以在控制台看到输出
下面还有一个不需要创建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,可以做一下修改,移植到刚刚的代码里看效果。