本文將介紹如何在Qt中連SQL Server數據庫,假設已經具備以下軟件環境:html
如何用sa(或者本身創建一個登陸名)登陸?c++
新手教程使用設置sa用戶登陸sql server2008sql
更改後重啓服務器才能生效,在Sql Server Configuration Manager中重啓SQL Server(MSSQLSERVER)服務。數據庫
ip用localhost比較好,由於若是在不一樣的電腦上執行的話,可能ip不一樣,可是localhost卻能夠準肯定位到ip。實現qt鏈接SQLserver實例設計模式
如何設置DSN名?服務器
總的來講有兩種方法:1.操做系統中配置DSN;2.在Qt程序中配置。markdown
Qt經過ODBC鏈接SQL Server2008實踐總結這篇文章有說第1種方法。在操做系統中配置DSN的時候,服務器是LN7XVE8H9DDB5A3(我電腦的名字,能夠在sql server中local右鍵屬性查看),hostname用的「local」。第2種,能夠直接看後面我給的示例代碼。網絡
sql server 2008不容許保存更改app
sql server 2008不容許保存更改,您所作的更改要求刪除並從新建立如下表
工具菜單—-選項—-Designers(設計器)—-阻止保存要求從新建立表的更改 取消勾選便可。工具
qsqlquery有兩種執行sql插入語句的方法(C++ Qt設計模式(第2版)379頁)
點擊紅色「執行SQL」按鈕
本地接連和遠程鏈接的區別
SQL Server 2008自己就是網絡數據庫,無論是訪問本地仍是遠程訪問,區別只是服務器不一樣,若是是遠程鏈接須要檢查遠程鏈接是否打開:
SQL Server 2008 R2如何開啓數據庫的遠程鏈接
沒有SQL Server的驅動
若是qt中沒有SQL Server的驅動請參考:Qt5.6.0(32位)編譯SQLServer驅動(ODBC)(vs2013)。
從外網訪問局域網裏的數據庫
這個比較麻煩,要知道局域網是沒有公網的IP的,訪問者和數據庫同在一個局域網能夠輕鬆訪問。若是想從外網訪問局域網裏的數據庫,須要端口映射,花生殼有這個功能,我試了一下可是沒有成功。
若是要讓代碼運行成功,在運行代碼前須要在SQL Server 2008中新建一個數據庫,這裏取名爲testdb
,在該數據庫中新建一張表,取名爲Table_1
,在該表中有三個字段:apple
,beer
,tree
,均爲float型,不爲null。
附上一段示例代碼(完整工程在這裏):
//測試SQLServer
#include <QtCore/QCoreApplication>
#include <QtSql/qsql.h>
#include <QtSql/qsqldatabase.h>
#include <QtSql/qsqlquery.h>
#include <QtSql/qsqlerror.h>
#include <QtSql/qsqltablemodel.h>
#include <qstring.h>
#include <qfile.h>
#include <qdebug.h>
#include <qvariant.h>
#include <qdatetime.h>
#include <qsqlrecord.h>
bool createConnection(QString driver, QString server, QString database, QString userName, QString passWord)
{
QSqlDatabase db = QSqlDatabase::addDatabase(driver);
//方式1.在程序中配置DSN
QString dsn = QString("Driver={SQL SERVER};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4").arg(server).arg(database).arg(userName).arg(passWord);//
//方式2.使用"控制面板"-"管理工具"-"數據源(ODBC)"進行配置
//QString dsn = QString::fromLocal8Bit("QTDSN");
db.setDatabaseName(dsn);
if (!db.open())
{
qDebug() << db.lastError();
return false;
}
return true;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString driver = "QODBC"; //驅動名
QString server = "LN7XVE8H9DDB5A3"; //SERVER=LN7XVE8H9DDB5A3(改爲本身電腦名),或者SERVER=192.168.168.61(改爲本身的IP)
QString database = "testdb"; //數據庫名
QString userName = "sa"; //登陸用戶
QString passWord = "123456"; //登陸密碼
bool isConncet = createConnection(driver, server, database, userName, passWord); //鏈接數據庫
if (!isConncet)
{
return 1; //鏈接失敗則返回1
}
//插入
QSqlQuery insertQuery;
insertQuery.prepare("INSERT INTO Table_1 (apple, beer, tree)"
"VALUES (?, ?, ?)"); //ODBC風格
insertQuery.addBindValue(12.3); // apple
insertQuery.addBindValue(32.1); // beer
insertQuery.addBindValue(34.45);// tree
insertQuery.exec();
//查找
QSqlQuery selectQuery;
selectQuery.exec("SELECT apple, beer FROM Table_1"); //sql查詢語句
while (selectQuery.next())
{
double apple = selectQuery.value(0).toDouble();
double beer = selectQuery.value(1).toDouble();
qDebug() << apple << " " << beer;
}
return a.exec();
}
能夠看到程序向數據庫中插入了一行數據,若是正常運行將會看到屏幕上輸出12.3 32.1.