QT提供了對多種數據庫的訪問支持,對SQL Server也可以通過ODBC來進行訪問。
要想順利訪問SQL Server。 首先要保證以下幾點:
1. QT編譯時已經編譯了QtSql
2. 編譯了ODBC插件。可以通過 configure -plugin-sql-odbc來保證,也可以單獨編譯~\src\plugins\sqldrivers\odbc
qmake -t vclib odbc.pro
qmake
nmake
編譯後,在~\plugins\sqldrivers\下應該有qsqlodbcd4.dll(debug)或qsqlodbc4.dll
QT中數據庫測試
下面的這段測試代碼非常有用,可以檢測自己的QT支持哪些數據
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << "\t" << driver;
}
3. 要連接數據庫,有3種方式:
參考下面的連接:QT連接ODBC數據庫
要注意的就是連接數據庫時使用的數據庫名,和sqlite等是不同的,並不是直接寫入數據庫名稱。
而是DSN名。
如果你已經設置好了DSN,可以直接輸入DSN名。 如果沒有,可以採用DSN連接字符串直接連接ODBC數據庫。
例如:
//下面例子連接到10.0.0.2上的sql server名爲temp的數據庫上。 程序中指定此連接的名稱爲dbTemp
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "dbTemp");
db.setHostName("10.0.0.2"); //如果dsn中已經含有SERVER,可以省略此句
QString dsn = QString::fromLocal8Bit("DRIVER={SQL SERVER};SERVER=10.0.0.2;DATABASE=temp");
//如果已經設定DSN,可以寫爲QString::fromLocal8Bit("SQLSERVER_DSN")
db.setDatabaseName(dsn);
//即使dsn中已經設置了UID和PASSWD,仍然需要執行setUserName和setPassword的步驟
db.setUserName("sa");
db.setPassword("xxxxxx");
if(!db.open()) {
QMessageBox::critical(0, QObject::tr("Database Error"),
db.lastError().text());
return false;
}
return true;
如果dsn名設錯,將會在db.open()時出現“[Microsoft][ODBC Driver Manager] Data
source name not found and no default driver specified QODBC3: Unable to connect”
“[Microsoft][ODBC 驅動程序管理器] 未發現數據源名稱並且未指定默認驅動程序
QODBC3:Unable to connect”錯誤。
其他類型數據庫應該修改dsn字符串與其相適應:
下面是ODBC和OLEDB的連接字符串寫法:
適合數據庫類型 連接方式
access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"
dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"
oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"
MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"
MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"
Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"
SQLite "Driver={SQLite3 ODBC Driver};Database=D:\SQLite\*.db"
OLEDB連接
適合的數據庫類型 連接方式
access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"
oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties'text;FMT=Delimited'"
configure -release -qt-sql-qpsql -L c:\pg\lib -I c:\pg\頭
mingw-utils包下載:http://www.qtcn.org/download/mingw-utils-0.3.tar.gz
在Qt4的文檔中在Windows下關於怎樣編譯mysql的驅動上面說
cd %QTDIR%\src\plugins\sqldrivers\mysql
qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.LIB" mysql.pro
nmake
If you are not using a Microsoft compiler, replace nmake with make in the line above.
mingw -utils包裏的reimp命令(如果沒有這個命令的話,可從本帖開頭處給出的地址中下載這個文件,並把它解壓開後的bin目錄裏的內容拷貝到 mingw的bin目錄下面。mysql安裝的時候默認的安裝路徑中有空格,我們得先把它的include和lib目錄拷貝到沒有空格的路徑下,比如C: \mysql下)
reimp -d libmysql.lib
dlltool -k -d libmysql.def -l libmysql.a
qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro
make
mingw32-make -f Makefile.Release
Makefile.Release:104: *** multiple target patterns. Stop.
mingw32-make[1]: Entering directory `D:/Qt/4.3.2/src/plugins/sqldrivers/mysql'
mingw32-make[1]: Leaving directory `D:/Qt/4.3.2/src/plugins/sqldrivers/mysql'
mingw32-make: *** [release] Error 2
解決:
set lib=
set include=
---------
即設置lib和include爲空。否則會在makefile里加上很多qt庫需要的無用的頭文件,如果你原來lib和include不爲空。
參考:http://www.qtcentre.org/forum/f-installation-5/t-did-you-try-qt-43-opensource-on-winxp--7428.html