Qt - ODBC連接SQL SERVER

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 ManagerData source name not found and no default driver specified QODBC3Unable to connect
“[Microsoft][ODBC 驅動程序管理器未發現數據源名稱並且未指定默認驅動程序 QODBC3:Unable to connect”錯誤。
其他類型數據庫應該修改dsn字符串與其相適應:
下面是ODBC和OLEDB的連接字符串寫法:

ODBC連接

適合數據庫類型 連接方式
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"
PostgreSQL "Driver={PostgreSQL ANSI};server=127.0.0.1;uid=admin;pwd=pass;database=databaseName"

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'"

--------------------------------------------------

編譯的時候加上posgresql的編譯選項就可以了
configure -release -qt-sql-qpsql -L c:\pg\lib -I c:\pg\頭


-----------------------------------------------------

0     假設你已經編譯安裝好了Qt開發環境並可正常使用(假設用的是VS2008+ QtVisualStudioIntegrationv1.43for.VS.2003.2005)一切操作均在windows下進行。
1           安裝MySQL
下載MySQL安裝程序,安裝時選擇Custom方式,選擇安裝目錄,目錄最好不要有空格,不要有中文,選擇安裝includelib文件。其它的就沒什麼了。Sqlyog是一個MySQL的圖形界面管理工具,可以安裝上,方便數據庫操作。
2           將安裝好的MySQL目錄下的include文件夾裏的文件(頭文件)複製到編譯工具的include文件夾下,再將MySQL目錄下的lib\opt裏的文件複製到編譯工具的lib文件夾下,簡而言之就是要讓編譯器能找到MySQL裏相應的文件。(該路徑也可在生成工程文件時添加給qmake
3       打開VS2008 命令提示符,將目錄切換到Qt\src\plugins\sqldrivers\mysql\,運行qmake
完了在運行nmake。不出錯的話MySQL的驅動就編好了。用如下代碼進行驅動測試:(這段程序編譯完之後不是運行,是調試,不然測試信息出不來)
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include <QMessageBox>
#include <QDebug>
int main(int argc, char* argv[])
{   
         QApplication app(argc, argv);
         qDebug() << "Available drivers:";
         QStringList drivers = QSqlDatabase::drivers();
         foreach(QString driver, drivers)     
                   qDebug() << "\t" << driver;
         QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
         qDebug() << "MYSQL driver valid?" << db.isValid();
}
測試結果如下圖:
windows qt訪問postgresql mysql集錦(轉) - 冰微草堂 - 冰微草堂
4           MySQL裏創建庫,創建庫時數據庫字符集選擇gbk編碼,創建數據庫名爲test,單表,表名爲testTable,表內屬性爲name  varchar ;(方便理解代碼)
5       用如下代碼測試連接數據庫並測試寫入、讀出數據是否成功,並測試數據是否亂碼。
#include <QtGui>
#include <QtSql>
#include <QTableView>
#include <QString>
#include <QObject>
int main(int argc, char **argv)
{
         QApplication app(argc, argv);
         QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk")); //設置tr()編碼。
         QSqlQueryModel *model;
         QTableView *table=new QTableView;
         QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
         db.setHostName("localhost");   //數據庫服務器
         db.setDatabaseName("test");   //數據庫名
         db.setUserName("root");      //登錄名
         db.setPassword("123456");    //密碼
         if(db.open())
         {
                   QMessageBox::information(0,QObject::tr("信息"),
QObject::tr("數據庫連接成功"));
                   QSqlQuery query;
                   query.exec(QObject::tr("INSERT INTO bbb VALUES ('柯南')"));
query.exec("SELECT name FROM testTable");//name爲屬性名;
                                                                                             //testTable爲表名
                   model=new QSqlQueryModel;
                   model->setQuery(query);
                   model->setHeaderData(0, Qt::Horizontal, QObject::tr("姓名"));
                   table->setModel(model);
                   table->show();
         }
         else
         {
                   // 數據庫打開失敗,顯示數據庫返回的失敗信息
                   QMessageBox::critical(0,QObject::tr("出錯"),db.lastError().text());
         }
         QApplication::connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit()));
         return app.exec();
}
運行結果如下圖:
windows qt訪問postgresql mysql集錦(轉) - 冰微草堂 - 冰微草堂

--------------------------------------------------------


QUOTE:
Qt4 OpenSource for mingw中編譯MySQL驅動

mingw-utils包下載:http://www.qtcn.org/download/mingw-utils-0.3.tar.gz

在Qt4的文檔中在Windows下關於怎樣編譯mysql的驅動上面說

You need to get the MySQL installation files. Run SETUP.EXE and choose "Custom Install". Install the "Libs & Include Files" Module. Build the plugin as follows (here it is assumed that MySQL is installed in C:\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.
這就是一個容易搞混的地方,上面是使用的libmysql.lib和nmake來編譯的,如果使用的是msvc的編譯器,那上面是沒問題的,但是如果使用的是mingw編譯器,那就會出錯,有undefined reference....等類錯誤字樣。這是因爲mingw使用的庫和msvc使用的不同格式的庫而引起的。而mysql只提供了msvc可使用的庫。 qt4 for mingw要想編譯出qsqlmysql庫來,我們先得編譯出mingw需要的libmysql.a這個文件來,可使用mingw工具來生成。
mingw -utils包裏的reimp命令(如果沒有這個命令的話,可從本帖開頭處給出的地址中下載這個文件,並把它解壓開後的bin目錄裏的內容拷貝到 mingw的bin目錄下面。mysql安裝的時候默認的安裝路徑中有空格,我們得先把它的include和lib目錄拷貝到沒有空格的路徑下,比如C: \mysql下)

cd c:\mysql\lib\opt
reimp -d libmysql.lib
dlltool -k -d libmysql.def -l libmysql.a
如此,這樣我們的命令行爲(注意qmake和make):

   cd %QTDIR%\src\plugins\sqldrivers\mysql
   qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C:\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro
   make
這下便會在%QTDIR%\plugins\sqldrivers目錄下面生成libqsqlmysql.a, qsqlmysql.dll這兩個文件了。
       有一點, 就是下載他給出的mingw-utils-0.3.tar.gz 文件, 只需要把裏面的 reimp 工具複製到你的 minGW目錄下的bin 裏就可以了,這樣按上面的步驟就可以生成需要的驅動了。 make 結束後, 庫文件會生成到qt的系統目錄中去。
-----------------------
           以上辦法一般都是可行的,如果還有問題的話,再參考下面這個,將環境變量的lib和include設爲空:
出現錯誤的話:
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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章