最近新做的一個項目需要使用qt5連接另一臺機器上的sql server,雖然網上已有類似文章,但還是有些其中很少提及的問題,故在這裡彙總下: qt連接sql server可以參考這篇文章: 《Qt 使用ODBC driver 連接SQL Server》 如果是連接另一臺機器的sql server就不 ...
最近新做的一個項目需要使用qt5連接另一臺機器上的sql server,雖然網上已有類似文章,但還是有些其中很少提及的問題,故在這裡彙總下:
qt連接sql server可以參考這篇文章:
《Qt 使用ODBC driver 連接SQL Server》
如果是連接另一臺機器的sql server就不用執行第一步“開啟ODBC驅動”了,另外指定資料庫用戶名和密碼可以使用Uid和Pwd,即原文dsn參數可以這樣寫:
QString dsn = QString("Driver={SQL Server};Server=%1;Database=%2;Uid=%3;Pwd=%4").arg(serverName).arg(dbName).arg(userName).arg(password);
而且“Trusted_Connection=yes”也要刪除,否則會報錯。
關於如何調用存儲過程可以參考如下文章:
其中QSqlQuery::prepare()的參數怎麼寫,其實只要在SQL Server Management Studio中先調用下存儲過程就會自動生成調用代碼,EXEC那部分再精簡下即可直接使用了。
推薦使用Oracle格式占位符即冒號方式如:argname,相比ODBC格式的?占位符方便很多。另外如果是多個output參數,可以用這樣寫:
query.prepare("exec PINSERTPC :arg1 output, :arg2 output");
最後還有一個需要註意的地方,sql server需要在所有結果集都被遍歷後才能通過query.boundValue獲取output參數的值,未遍歷前獲取的其實仍是query.bindValue時的預設值,具體可以參見bool QSqlQuery::nextResult()的介紹:
Note that some databases, i.e. Microsoft SQL Server, requires non-scrollable cursors when working with multiple result sets. Some databases may execute all statements at once while others may delay the execution until the result set is actually accessed, and some databases may have restrictions on which statements are allowed to be used in a SQL batch.