(一)QODBC資料庫程式設計連接配接詳細介紹
QT QODBC資料庫程式設計連接配接詳細介紹是本文所介紹的内容,QT為資料庫程式設計提供了一個類似JDBC的統一操作模型,它的底層是具體資料庫或資料庫接口的插件,由它們負責完成真正的資料庫操作。
QT自帶有QODBC Driver,在Windows平台上通過系統提供的ODBC Driver可以通路支援ODBC的資料庫,如Ms Access、SQL Server等 (Windows XP 自帶有Access和SQL Server的ODBC Driver)。
QT資料庫模型的基礎類是QSqlDatabase對象,擁有一個QSqlDatabase對象代表着擁有一個資料庫的連接配接,在一個已經Open的QSqlDatabase對象上,我們就可以執行各種資料庫操作。
要得到一個QSqlDatabase對象的方法是QSqlDatabase的靜态函數addDatabase,它建立一個新的QSqlDatabase對象,并注冊在内部的Hash表中,最後傳回該對象。 (另外靜态函數database可用于查詢一個已經注冊的QSqlDatabase對象)
當我們得到一個新的還沒有Open的QSqlDatabase對象,我們要先設定資料庫的DSN(Data Source Name),DSN的設定是通過成員函數setDatabaseName,在QODBC中,DSN可以是多種形式
1、作業系統注冊的DSN名字
2、一個外部的DSN檔案
3、可以被解釋的字元串
1和2我們可以在管理面闆的ODBC管理面闆裡面設定或者生成,但是無疑第3種形式更具備靈活性,連接配接Access的DSN字元串具備類似的形式:
- "DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=xxx.mdb"
下面是一段用于獲得某個指定的mdb檔案的資料庫連接配接的代碼,函數會先檢測是否系統已有該檔案的資料庫連接配接,如果有則再檢查該連接配接是否已打開,如果已打開則直接傳回,如果有連接配接但處于關閉狀态中則打開後傳回,如果還未有任何連接配接則建立一個新的連接配接,打開後傳回。最後打開失敗會抛出一個KDBException異常。
- QSqlDatabase KDBConnection::getAccessConnection(
- const QString& accessFile, const QString& userName,
- const QString& password)
- ...{
- const QString PREFIX("puremilk.access.connection");
- QString connID = PREFIX + "-" + accessFile;
- QSqlDatabase connection = QSqlDatabase::database(connID, false);
- if (connection.isValid())
- ...{
- if (connection.isOpen())
- return connection;
- }
- else
- connection = QSqlDatabase::addDatabase("QODBC", connID);
- QString dsn = QString(
- "DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=%1").arg(accessFile);
- qDebug()<<"Get Access Database connection - "<<dsn;
- connection.setDatabaseName(dsn);
- if (!connection.open(userName, password))
- ...{
- THROW_EXCEPTION(KDBException, connection.lastError().text());
- }
- return connection;
- }
小結:QT QODBC資料庫程式設計連接配接詳細介紹的内容介紹完了,希望本文對你有幫助,關于資料庫的更多内容請參考編輯推薦。
(二)QT與資料庫連接配接執行個體(!!!)
本文介紹的是QT與資料庫連接配接執行個體,首先加載驅動db=QSqlDatabase::addDatabase("QODBC","db"); // 使用odbc資料庫驅動,詳細内容請看下文。
連接配接資料庫需要的頭檔案:
- #include <QSqlDatabase>
- #include <QSqlQuery>
1、連接配接微軟的Access
- QSqlDatabase ldb = QSqlDatabase::addDatabase("QODBC");
- ldb.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=system.mdb;UID=;PWD=xiaozhuset");
- bool ok = ldb.open();
- //新定義一個查詢集合,并指定 連結關鍵字。 如果有多個連接配接,可以随意指定一個你需要的。
- QSqlQuery mquery=QSqlQuery::QSqlQuery(ldb);
- if(ok)
- {
- bool isok=mquery.exec("select * from sql_set;");
- if (!isok)
- {
- ldb.close();
- return -1;
- }
- //這個是必須的,因為查處的結果集目前位置不在第一條記錄上。
- mquery.next();
- QString sHostName=mquery.value(1).toString();
- QString sDatabaseName=mquery.value(2).toString();
- QString sUserName=mquery.value(3).toString();
- QString sPassword=mquery.value(4).toString();
- //清除結果集
- mquery.clear();
- // 如果該連接配接不再使用,就可以關閉。
- ldb.close();
- //這裡是将從資料庫讀出的資料寫到一個list控件裡
- ui.list_out->insertItem(ui.list_out->count(),sHostName);
- ui.list_out->insertItem(ui.list_out->count(),sDatabaseName);
- }
- else
- {
- // 打開本地資料庫失敗,
- QMessageBox::critical(0, QObject::tr("讀取Access資料庫錯誤!"),db.lastError().text());
- return -1;
- }
2、連接配接mssql2000 資料庫
- QString strDatabaseName = QString("DRIVER={SQL Server};Server=(%1);Database=%2").arg("local").arg(sDatabaseName);
- db=QSqlDatabase::addDatabase("QODBC","db"); // 使用odbc資料庫驅動
- db.setHostName(sHostName);
- db.setPort(1433);
- db.setDatabaseName(strDatabaseName); // 我們之前建立的資料庫連接配接關鍵字
- db.setUserName(sUserName);
- db.setPassword(sPassword);
- bool ok = db.open(); //嘗試連接配接資料庫
- if(ok)
- {
- menuset_set->dbdb=db; // 這裡用sa已經成功連上資料庫
- return 0;
- }
- else
- {
- // 打開資料庫失敗,
- QMessageBox::critical(0, QObject::tr("資料庫連接配接錯誤!"),db.lastError().text());
- return -2;
- }
- mssql2000資料庫連接配接的使用和Access連接配接使用方法一樣。
- QSqlQuery mquery=QSqlQuery::QSqlQuery(db);
- bool ok1=mquery.exec("select * from CarteMenu;");
- if (ok1==false)return -1;
- QString menu_mkey=mquery.value(13).toString();
- QString strmenu_lang=mquery.value(3).toString();
- //清除結果集
- mquery.clear();
3、連接配接mysql 資料庫
- QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 使用mysql資料庫驅動
- db.setHostName("localhost");
- db.setDatabaseName("exampledb"); // 資料庫名稱
- db.setUserName("sa"); // 使用者名
- db.setPassword("1"); // 密碼
- bool ok = db.open(); // 嘗試連接配接資料庫
- if(ok)
- {
- QSqlQuery myquery;
- if(myquery.exec("select * from employeedb"))
- {
- int num = 0;
- if(db.driver()->hasFeature(QSqlDriver::QuerySize))
- {
- num = myquery.size(); // 如果支援結果影響的行數,那麼直接記錄下來
- }
- else
- {
- myquery.last(); //否則定位到結果最後
- num = myquery.at() + 1;
- }
- //這裡添加資料庫的查詢結果處理操作
- }
- else // 如果查詢失敗
- {
- QSqlError error = myquery.lastError();
- }
- }
- else // 打開資料庫失敗
- {
- }
小結:QT與資料庫連接配接執行個體的内容介紹完了,對于資料庫,本人覺得連接配接時要慎重點,好像很難連接配接似得,老是出錯,不顧本篇文章相信能幫你解決問題。