qt连接mdb_【原创】QT数据库学习和以连接Access为例
Qt能夠實現對不同數據的支持,例如常見的oracl、MySql、Sql
Server、Access等等。首先Qt是通過QSqlDabase來創建數據庫的連接,下面是創建一個QSqlDabase的實例:
db.setHostName(“XXX”); //設置主機名
db.setDabaseName(“XXX”);//設置數據庫名
db.setUserName(“XXX”);//設置用戶名
db.setPassword(“XXX”);//設置密碼
if(!db.open())//打開數據庫連接
{
//error
}
上面的第一行中”QSQLITE”是對應數據庫的驅動名稱,也就說訪問不同的數據庫對應的驅動是不一樣的。通常可以通過以下代碼:
QStringList drivers = QSqlDabase::drivers();
Foreach(QString driver,drivers)
qDebug()<
這樣就可以知道自己版本的qt有幾種不同的驅動。我的版本是Qt5.3,下面是在幫助文檔看到Qt支持的所有驅動。例如我們常見的access數據庫對應的是QODBC,MySql的驅動是QMYSQL,Oracle數據的驅動是QOCI。
現在我們要了解一個數據庫,就是上面例子”QSQLITE”所對應的數據庫。它所連接的是SQLite數據庫,是一種輕型的文件型數據庫,主要應用于嵌入式領域而且支持跨平臺,Qt的默認數據連接就是SQlite數據。SQlite沒有對應的數據庫系統,它通過我們寫的代碼直接編譯可生成這樣的一個數據庫文件。例如上面的代碼執行完后QSqlDabase
db = QSqlDabase::addDatabase(“QSQLITE”);
db.setHostName(“XXX”); //設置主機名
db.setDabaseName(“XXX”);//設置數據庫名
db.setUserName(“my.db”);//設置用戶名
db.setPassword(“XXX”);//設置密碼
if(!db.open())//打開數據庫連接
{
//error
}
就在我們編譯生成Debug文件夾看到一個my.db的文件。
但實際上我們通常要訪問一個比較常見的數據庫,例如Access數據庫。下面來介紹Qt怎么訪問Access。
首先我們在要執行QSqlDabase db =
QSqlDabase::addDatabase(“QODBC”);這條語句,注意到此時的驅動已經換成了QODBC,接著關鍵的是db.setDabaseName(“XXX”);這條語句。可能剛開始天真的以為只要把驅動名稱換成QODBC,然后我們新建一個access文件名稱為命名為File.mdb,然后執行db.setDabaseName(“File.mdb”);這條語句就能訪問access數據庫文件了,但實際上是不行的。在幫助文檔查看setDabaseName屬性,你會發現這里有詳細的說明如何訪問access的例子。
For the QOCI (Oracle) driver, the database name is the TNS
Service Name.
For the QODBC driver,
the?name?can either be a
DSN, a DSN filename (in which case the file must have
a.dsnextension),
or a connection string.
For example, Microsoft
Access users can use the following connection string to open
an.mdbfile
directly, instead of having to create a DSN entry in the ODBC
manager:
...
db.setDatabaseName("DRIVER={Microsoft Access Driver
(*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb");
if (db.open()) {
//
success!
}
...
上面就是說如果采用QOCI驅動,那么database的name要使用TNS服務的名稱。而如果采用QODBC驅動,那么database的name就要采用DNS名稱或者連接字符串這兩種方式。這里的name就是指void
QSqlDatabase::setDatabaseName(const QString &
name)里面這個name參數。然后它給出了采用連接字符串這種方法的例子就是上面那段代碼,其中最關鍵的就是這句:
db.setDatabaseName("DRIVER={Microsoft Access Driver
(*.mdb)};FIL={MS Access};DBQ=myaccessfile.mdb");
如果你本地的access文件是file.mdb,那么只要把上面DBQ=后面的這個換成你自己的文件,
DBQ = file.mdb,其他都相同,這樣就能成功連接你本地的access數據庫了。到這里雖然能實現預期的目的,但總感覺一頭霧水,我本身對數據庫的了解也僅次于那些sql語句,上面連接字符串的其他部分代表什么含義,ODBC是什么東西,還有另外一種方法中提到的DSN是什么東西都不知道,所以花了一段時間在網上查找相關資料,終于大致了解ODBC,DNS還有應用程序連接數據庫之間的過程原理等。
在百科上ODBC是這樣定義的:開放數據庫互連(Open
Database Connectivity,ODBC)是微軟公司開放服務結構(WOSA,Windows
Open Services Architecture)中有關數據庫的一個組成部分,它建立了一組規范,并提供了一組對數據庫訪問的標準API(應用程序編程接口)。這樣講很抽象,為了弄懂它來看這張在網上找的圖,如下圖中應用層就是指我們的應用程序,數據層就是我們要訪問的數據庫了,所以你可以簡單把ODBC當作橋梁。ODBC管理器是關鍵的組成,ODBC管理器不是屬于應用層,也不是屬于數據層,也就是說這個ODBC管理器不屬于Qt的范疇,也不屬于Access,它是基于windows系統的一個ODBC部分。它是用來管理不同的數據源,應用程序要訪問數據庫,首先必須在ODBC管理器創建一個數據源。
也就是我們在ODBC管理器設置一些內容后,ODBC管理器就會幫我們把應用層和數據庫之間的道路打通,至于它是怎么打通的,那就是微軟提供的ODBC中的內容,我們不必知道也沒辦法知道,那么ODBC管理器應該設置一些什么東西呢?其實就是設置數據源。
在上面我們曾遇到過DSN,DSN是Data Source Name的縮寫,也就是DSN就是數據源的名稱,那么什么是數據源呢?數據源顧名思義就是數據的來源,它包含數據庫存儲位置、類型及ODBC驅動程序信息等等。我們把這么一個數據的來源用一個名字命名,這個名字就是DSN了。例如我接收到來自上海市XX區XX路XX號的一個快遞,每個快遞都對應一個快遞號例如003945,那么這個數據源就是上面的那條地址,數據源名稱就是快遞號了,當然這是我比較粗的理解,也許很不恰當。
ODBC管理器的作用就是根據數據源提供的數據庫存儲位置、類型及ODBC驅動程序信息,建立起ODBC與一個特定數據庫的聯系,以后程序只需要提供數據源名稱就可以直接訪問數據庫了。如果我們要訪問一個在D:\mydata.mdb這個access數據庫文件,那么你只需要告訴ODBC管理器這個是一個Access數據庫文件,它在的位置是D:\mydata.mdb這個路徑,采用的ODBC驅動,那么ODBC管理器就會自動幫你把你的應用程序和mudata.mdb連接了,而它在內部是怎么實現的我們不需要知道。ODBC管理器在計算機的位置是--控制面板\系統和安全\管理工具。
點擊添加按鈕,出現一個驅動對話框,選擇access對應的驅動如圖然后點擊完成后出現一個對話框,看到了嗎有一個光標處就是填寫數據源名稱也就是DSN,例如我填的是connectDatabase,然后點擊數據庫連接彈出一個選擇數據庫對話框,之后我們在目錄選擇我們要連接的數據庫文件的路徑,然后點擊確定,那么ODBC管理器就幫助我們把應用程序和數據庫連接了,此時記住這個數據源名connectDatabase,然后回到上面QSqlDatabase::setDatabaseName屬性,大致代碼如下:
QSqlDabase db =
QSqlDabase::addDatabase(“QODBC”);//選擇QODBC驅動
db.setDabaseName(“connectDatabase”);//設置數據庫名,我們自己起的數據源名
if(!db.open())//打開數據庫連接
{
//error
}
這時在看參考文檔的這句話:For
example, Microsoft Access users can use the following connection
string to open an.mdbfile
directly, instead of having to create a DSN entry in the ODBC
manager:你會豁然開朗了,要嘛用連接字符串,要嘛去ODBC
manager管理器去設置好數據源,這兩種方法都可以幫助應用程序連接到Access數據庫。通過比較顯然連接字符串的方式要簡單很多了,下面這張表是在網上找到不同數據庫對應的連接字符串的書寫格式,注意如果格式不正確是沒辦法連接到數據庫的。
總結
以上是生活随笔為你收集整理的qt连接mdb_【原创】QT数据库学习和以连接Access为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 5745 La Vie en r
- 下一篇: 群晖NAS在线办公表格文件转成excel