公司領導說要跟一個醫院對接數據庫,我這就去了解了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,可以做一下修改,移植到剛剛的代碼里看效果。