最近在作數據庫的課程設計。第一個須要解決的問題是使用什麼工具來實現這個系統。通過一番資料查找,決定使用SQL Server Express 2012做爲服務器,使用Qt做爲編寫客戶端程序語言。問題是client如何鏈接SQL Server? 下面是個人解決方法。html
1.開啓windows上的SQL Server 的ODBC驅動sql
ODBC 是一個調用級接口,它使得應用程序得以訪問任何具備 ODBC 驅動程序的數據庫中的數據。使用 ODBC 能夠建立具備訪問任何數據庫(最終用戶具備該數據庫的 ODBC 驅動程序)的權限的數據庫應用程序。ODBC 提供了使您的應用程序獨立於源數據庫管理系統 (DBMS) 的 API。一個應用程序訪問DBMS中數據庫的過程:應用程序使用ODBC API 向DBMS的ODBC Driver發起鏈接,應用程序的全部查詢事務都將經過ODBC Driver來操做DBMS的數據庫。所以要操做DBMS必須先啓動ODBC Diver。下面是啓動過程。數據庫
(1)控制面板->管理工具->數據源編程
(2)用戶DSN->選擇「添加」,添加數據源(如上圖所示)。選擇數據源驅動程序爲SQL Server(以下圖所示).windows
(3)建立到SQL Server的數據源。這裏注意選擇本身SQL Server的實例做爲服務器,例如我這裏是DCKRSHW5HQU8SM1\SQLEXPRESS。服務器
(4)選擇登陸驗證方式。因爲我鏈接SQL Server的方式Windows Authentication,所以選擇第一項。若是你的鏈接方式是SQL Server Authentication,請選擇第二項並填寫ID和password。工具
(5)更改默認數據庫,下一步,完成。測試
(6)測試數據源網站
2. 編程鏈接SQL Serverthis
我使用的Qt5.1.1(VS2012),在路徑:Qt安裝根目錄/msvc2012/plugins/sqldrivers下能夠找到支持ODBC的qsqlodbcd.dll。在路徑:Qt安裝根目錄/msvc2012/include/QtSql下能夠找到對應頭文件。
關於ODBC API 的使用文檔在路徑:Qt安裝根目錄/msvc2012/doc/qtsql 下。打開index.html便可使用。
爲了可以使用ODBC API 源程序須要添加 頭文件
#include<QtSql/QtSql>
在.pro文件中添加一行來添加sql動態庫
QT +=sql
若是你當前的編譯方式是Debug出現以下錯誤,將編譯方式改成Release便可編譯。
main.obj:-1: error: LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QSqlDatabase::~QSqlDatabase(void)" (__imp_??1QSqlDatabase@@QAE@XZ) referenced in function _main
debug報錯而release不報錯這個問題我糾結了好久。其實緣由是,當使用QT+=sql添加sql模塊後,直接構建項目,項目的makefile.debug裏面並無添加sql的debug庫。當執行qmake後,sql模塊的debug庫會被添加到makefile.debug裏面。以下面所示:
LIBS = /LIBPATH:D:\ProgramFiles\Programing\Qt\Qt5.1.1\5.1.1\msvc2012\lib D:\ProgramFiles\Programing\Qt\Qt5.1.1\5.1.1\msvc2012\lib\Qt5Sqld.lib D:\ProgramFiles\Programing\Qt\Qt5.1.1\5.1.1\msvc2012\lib\Qt5Cored.lib
源程序:
1 #include <QCoreApplication> 2 //#include <QtSql/QSql> 3 #include <QtSql/QtSql> 4 #include<stdio.h> 5 #include<stdlib.h> 6 7 int main(int argc, char *argv[]) 8 { 9 //QCoreApplication a(argc, argv); 10 11 QString serverName = "DCKRSHW5HQU8SM1\\SQLEXPRESS"; 12 QString dbName = "test"; 13 QSqlDatabase myDB = QSqlDatabase::addDatabase("QODBC");//鏈接到ODBC驅動 14 QString dsn = QString("Driver={SQL Server};Server=%1;Database=%2;Trusted_Connection=yes").arg(serverName).arg(dbName); 15 myDB.setDatabaseName(dsn); 16 if(myDB.open()) 17 { 18 printf("connect to server successfully\n"); 19 myDB.close(); 20 } 21 else 22 { 23 printf("connect to server failed\n"); 24 printf("%s\n",myDB.lastError().text().toLatin1().data()); 25 } 26 27 return 0; 28 29 //return a.exec(); 30 }
如何使用API進行鏈接請參考文檔,我再這裏想重點指出的是如何寫"創建鏈接字符串"。上面代碼中個人ODBC鏈接字符串是
"Driver={SQLServer};Server=DCKRSHW5HQU8SM1\\SQLEXPRESS;Database=test;Trusted_Connection=yes"
該鏈接字符串之因此沒有Uid和Pwd字段是由於個人SQL Server的登陸方式爲Windows Authentication。若是登陸方式爲SQL Server Authentication,請添加這兩個字段。
關於Connection Strings,下面這個網站有全部的Connection Strings收集。
http://www.carlprothman.net/Default.aspx?tabid=81
程序運行結果: