一、 ODBC原理
ODBC 是Open Database Connect 即開放數(shù)據(jù)庫互連的簡(jiǎn)稱,它是由Microsoft 公司于1991 年提出的一個(gè)用于訪問數(shù)據(jù)庫的統(tǒng)一界面標(biāo)準(zhǔn),是應(yīng)用程序和數(shù)據(jù)庫系統(tǒng)之間的中間件。它通過使用相應(yīng)應(yīng)用平臺(tái)上和所需數(shù)據(jù)庫對(duì)應(yīng)的驅(qū)動(dòng)程序與應(yīng)用程序的交互來實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操作,避免了在應(yīng)用程序中直接調(diào)用與數(shù)據(jù)庫相關(guān)的操作,從而提供了數(shù)據(jù)庫的獨(dú)立性。
ODBC 主要由驅(qū)動(dòng)程序和驅(qū)動(dòng)程序管理器組成。驅(qū)動(dòng)程序是一個(gè)用以支持ODBC 函數(shù)調(diào)用的模塊,每個(gè)驅(qū)動(dòng)程序?qū)?yīng)于相應(yīng)的數(shù)據(jù)庫,當(dāng)應(yīng)用程序從基于一個(gè)數(shù)據(jù)庫系統(tǒng)移植到另一個(gè)時(shí),只需更改應(yīng)用程序中由ODBC 管理程序設(shè)定的與相應(yīng)數(shù)據(jù)庫系統(tǒng)對(duì)應(yīng)的別名即可。驅(qū)動(dòng)程序管理器可鏈接到所有ODBC 應(yīng)用程序中,它負(fù)責(zé)管理應(yīng)用程序中ODBC 函數(shù)與DLL 中函數(shù)的綁定。
ODBC 使用層次的方法來管理數(shù)據(jù)庫,在數(shù)據(jù)庫通信結(jié)構(gòu)的每一層,對(duì)可能出現(xiàn)依賴數(shù)據(jù)庫產(chǎn)品自身特性的地方,ODBC 都引入一個(gè)公共接口以解決潛在的不一致性,從而很好地解決了基于數(shù)據(jù)庫系統(tǒng)應(yīng)用程序的相對(duì)獨(dú)立性,這也是ODBC 一經(jīng)推出就獲得巨大成功的重要原因之一。
從結(jié)構(gòu)上分,ODBC 分為單束式和多束式兩類。
1. 單束式驅(qū)動(dòng)程序
單束式驅(qū)動(dòng)程序介于應(yīng)用程序和數(shù)據(jù)庫之間,像中介驅(qū)動(dòng)程序一樣數(shù)據(jù)提供一個(gè)統(tǒng)一的數(shù)據(jù)訪問方式。
當(dāng)用戶進(jìn)行數(shù)據(jù)庫操作時(shí),應(yīng)用程序傳遞一個(gè)ODBC 函數(shù)調(diào)用給ODBC 驅(qū)動(dòng)程序管理器,由ODBC API 判斷該調(diào)用是由它直接處理并將結(jié)果返回還是送交驅(qū)動(dòng)程序執(zhí)行并將結(jié)果返回。
由上可見,單束式驅(qū)動(dòng)程序本身是一個(gè)數(shù)據(jù)庫引擎,由它直接可完成對(duì)數(shù)據(jù)庫的操作,盡管該數(shù)據(jù)庫可能位于網(wǎng)絡(luò)的任何地方。
2. 多束式驅(qū)動(dòng)程序
多束式驅(qū)動(dòng)程序負(fù)責(zé)在數(shù)據(jù)庫引擎和客戶應(yīng)用程序之間傳送命令和數(shù)據(jù),它本身并不執(zhí)行數(shù)據(jù)處理操作而用于遠(yuǎn)程操作的網(wǎng)絡(luò)通信協(xié)議的一個(gè)界面。
前端應(yīng)用程序提出對(duì)數(shù)據(jù)庫處理的請(qǐng)求,該請(qǐng)求轉(zhuǎn)給ODBC 驅(qū)動(dòng)程序管理器,驅(qū)動(dòng)程序管理器依據(jù)請(qǐng)求的情況,就地完成或傳給多束驅(qū)動(dòng)程序,多束式驅(qū)動(dòng)程序?qū)⒄?qǐng)求翻譯為特定廠家的數(shù)據(jù)庫通信接口(如Oracle 的SQLNet)所能理解的形式并交于接口去處理,接口把請(qǐng)求經(jīng)網(wǎng)絡(luò)傳送給服務(wù)器上的數(shù)據(jù)引擎,服務(wù)器處理完后把結(jié)果發(fā)回給數(shù)據(jù)庫通信接口,數(shù)據(jù)庫接口將結(jié)果傳給多束式ODBC 驅(qū)動(dòng)程序,再由驅(qū)動(dòng)程序?qū)⒔Y(jié)果傳給應(yīng)用程序。
很多程序員已經(jīng)體會(huì)到了在Windows平臺(tái)下的ODBC的益處,而在Linux/Unix下進(jìn)行數(shù)據(jù)庫編程的時(shí)候卻不得不根據(jù)不同的數(shù)據(jù)庫來選擇特有的API進(jìn)行編程,一旦數(shù)據(jù)庫發(fā)生了改變,所有與這些API相關(guān)的程序都必須進(jìn)行修改。其實(shí)在Linux/Unix下現(xiàn)在也有了自己的ODBC,可以使我們的數(shù)據(jù)庫編程就像在Windows平臺(tái)下一樣簡(jiǎn)單。
下面我們開始介紹Linux/Unix下的ODBC:
二、 Linux/Unix下ODBC的安裝:
方法一:
先下載的unixODBC源碼包(http://www.unixodbc.org/unixODBC-2.2.1.tar.gz)放到/usr/local下,然后運(yùn)行下述命令:
tar zxvf unixODBC-2.2.1.tar.gz
cd unixODBC-2.2.1
./configure --prefix=/usr/local/unixODBC-2.2.1 --includedir=/usr/include --libdir=/usr/lib -bindir=/usr/bin --sysconfdir=/etc
make
make install
安裝成功后,unixODBC所需的頭文件都被安裝到了/usr/inlucde下,編譯好的庫文件安裝到了/usr/lib下,與unixODBC相關(guān)的可執(zhí)行文件安裝到了/usr/bin下,配置文件放到了/etc下。
方法二:
下載rpm包進(jìn)行安裝,我們這里以Red Hat 7.3為例:
unixODBC-2.2.0-5 RPM for i386(安裝包及源碼包)
(ftp://speakeasy.rpmfind.net/linux/redhat/7.3/en/os/i386/RedHat/RPMS/unixODBC-2.2.0-5.i386.rpm、ftp://ftp.rpmfind.net/linux/redhat/7.3/en/os/i386/SRPMS/unixODBC-2.2.0-5.src.rpm)
unixODBC-devel-2.2.0-5 RPM for i386
(ftp://speakeasy.rpmfind.net/linux/redhat/7.3/en/os/i386/RedHat/RPMS/unixODBC-devel-2.2.0-5.i386.rpm)
直接將unixODBC-2.2.0-5.i386.rpm和unixODBC-devel-2.2.0-5.i386.rpm裝入系統(tǒng)就可以了,命令如下:
rpm -ivh unixODBC-2.2.0-5.i386.rpm
rpm -ivh unixODBC-devel-2.2.0-5.i386.rpm
安裝好以后,所需的各個(gè)部分與上面所列的位置相同。
三、 Linux/Unix下ODBC的配置:
運(yùn)行ODBCConfig程序(在/usr/bin下)。
步:安裝數(shù)據(jù)庫的ODBC驅(qū)動(dòng)程序
Drivers這一欄中用來設(shè)置數(shù)據(jù)庫的驅(qū)動(dòng)程序,點(diǎn)擊Add按鈕。Name一欄填入數(shù)據(jù)庫驅(qū)動(dòng)的名稱,Description是數(shù)據(jù)庫驅(qū)動(dòng)的描述,Driver是用來選擇數(shù)據(jù)庫驅(qū)動(dòng)程序的,Setup是用來選擇數(shù)據(jù)庫驅(qū)動(dòng)安裝程序的,如果你是按照上述安裝方法安裝的,這些程序都放在/usr/lib下,下面是數(shù)據(jù)庫驅(qū)動(dòng)程序的列表:
數(shù)據(jù)庫 數(shù)據(jù)庫驅(qū)動(dòng)程序 數(shù)據(jù)庫驅(qū)動(dòng)安裝程序
TXT libodbctxt.so libodbctxtS.so
NNTP libnn.so libodbcnnS.so
MiniSQL libodbcmini.so libodbcminiS.so
PostgreSQL libodbcpsql.so libodbcpsqlS.so
MySQL (注釋) libodbcmyS.so
Sybase/MS SQL (注釋) libtdsS.so
Oracle (注釋) liboraodbcS.so
注釋:
MySQL、Sybase/MS SQL和Oracle的數(shù)據(jù)庫驅(qū)動(dòng)可以在下列網(wǎng)址找到:
MySQL http://www.unixodbc.org/myodbc.html
Sybase/MS SQL http://www.freetds.org
Oracle http://www.easysoft.org
MySQL的驅(qū)動(dòng)程序MyODBC-2.50.39-4 RPM for i386以及源碼包:
ftp://speakeasy.rpmfind.net/linux/redhat/7.3/en/os/i386/RedHat/RPMS/MyODBC-2.50.39-4.i386.rpm
ftp://ftp.redhat.com/pub/redhat/linux/7.3/en/os/i386/SRPMS/MyODBC-2.50.39-4.src.rpm
選擇好驅(qū)動(dòng)程序之后,點(diǎn)擊"√"保存退出。
第二步:設(shè)置DSN
DSN分為User DSN、System DSN和File DSN三種,我們以System DSN為例。選中System DSN一欄以后,點(diǎn)擊Add…。列表中會(huì)列出你已經(jīng)安裝好的數(shù)據(jù)庫驅(qū)動(dòng)程序,我這里只裝了MySQL和PostgreSQL,然后選擇你所要使用的驅(qū)動(dòng)程序,然后點(diǎn)擊OK。我這里使用的是MySQL的數(shù)據(jù)庫驅(qū)動(dòng),不同的數(shù)據(jù)庫,這個(gè)窗口的內(nèi)容會(huì)有所不同。Name是數(shù)據(jù)源的名稱,Description是描述,Server可以選擇服務(wù)器,如果本機(jī)啟動(dòng)了MySQL就可以選擇localhost,如果Port和Socket有特殊要求,再根據(jù)實(shí)際情況進(jìn)行修改,Database是用來選擇數(shù)據(jù)庫的,下拉菜單不一定包含所有的數(shù)據(jù)庫,你可以把自己已經(jīng)創(chuàng)建好的數(shù)據(jù)庫名稱填寫在這里。都配置好之后,點(diǎn)擊"√"保存退出。
這樣Linux/Unix下的ODBC數(shù)據(jù)源就已經(jīng)設(shè)置好了,大家還可以在ODBCConfig程序的Status欄中查看ODBC的使用情況,在Advanced欄中設(shè)置是否做日志或者啟動(dòng)連接池,在About欄中,有一個(gè)Linux/Unix ODBC的示意圖,在Credits按鈕中可以看到所有開發(fā)者的名字的列表。 ODBCConfig程序中所有有關(guān)數(shù)據(jù)庫驅(qū)動(dòng)程序的信息被放在odbcinst.ini(在/etc下)文件中,有關(guān)DSN的信息被放在odbc.ini(在/etc下)文件中,大家有興趣的話,可以自己去觀察一下。
第三步:使用DataManager程序?yàn)g覽數(shù)據(jù)庫
運(yùn)行DataManager程序之后就可以查看Drivers、System DSN和User DSN這幾項(xiàng)內(nèi)容,,在瀏覽數(shù)據(jù)庫的時(shí)候,可以在右面的SQL欄中輸入SQL語句,然后點(diǎn)擊人形按鈕就可以運(yùn)行SQL語句,運(yùn)行結(jié)果會(huì)在Results一欄中顯示出來。
第四步:使用isql程序查看數(shù)據(jù)庫
unixODBC還提供了命令臺(tái)下查看數(shù)據(jù)庫的程序,這就是isql,用法如下:
isql DSN [UID [PWD]] [options]
DSN 數(shù)據(jù)源名稱
UID 用戶ID
PWD 用戶密碼
Options:
-b 批處理,沒有提示符的模式
-dx 設(shè)置列之間的分隔符為x
-w 將查詢結(jié)果輸出為HTML格式
-c 行輸出列名
--version 輸出isql的版本號(hào)
四、 Linux/Unix下ODBC的編程:
1、使用unixODBC提供的ODBC API進(jìn)行編程:
在進(jìn)行編程之前,我們來看一下ODBC API中的常用數(shù)據(jù)類型與我們?cè)贑語言中使用的數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系:
類型標(biāo)識(shí)符 ODBC數(shù)據(jù)類型 C數(shù)據(jù)類型
SQL_C_CHAR SQLCHAR * unsigned char *
SQL_C_SSHORT SQLSMALLINT short int
SQL_C_USHORT SQLUSMALLINT unsigned short int
SQL_C_SLONG SQLINTEGER long int
SQL_C_FLOAT SQLREAL float
SQL_C_DOUBLE SQLDOUBLE, SQLFLOAT double
SQL_C_BINARY SQLCHAR * unsigned char *
SQL_C_TYPE_DATE SQL_DATE_STRUCT struct tagDATE_STRUCT {SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; } DATE_STRUCT;
SQL_C_TYPE_TIME SQL_TIME_STRUCT struct tagTIME_STRUCT {SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; } TIME_STRUCT;
我們這里使用的數(shù)據(jù)庫名稱為test(DSN),這個(gè)DSN使用的用戶名是root,密碼為空,表的名稱是web,字段情況如下:
>
字段名 數(shù)據(jù)類型
id integer
name char(40)
size integer
:設(shè)定ODBC環(huán)境句柄并設(shè)置參數(shù)
首先我們需要聲明一個(gè)ODBC環(huán)境句柄(SQLHENV),它可以用來獲得有關(guān)的ODBC環(huán)境信息,我們需要調(diào)用SQLAllocHandle ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &V_OD_Env )來獲得這個(gè)句柄,V_OD_Env就是要分配的SQLHENV類型的環(huán)境句柄。
分配好句柄之后,你給它需要設(shè)定所使用的ODBC版本,你可以調(diào)用SQLSetEnvAttr ( V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 ),SQL_ATTR_ODBC_VERSION是存放你定義的ODBC版本號(hào)的變量,SQL_OV_ODBC3則說明你的程序使用的是ODBC 3.0。
第二:設(shè)定連接句柄并設(shè)置超時(shí)參數(shù)
我們需要聲明一個(gè)連接句柄(SQLHDBC),用來存放數(shù)據(jù)庫連接信息的,調(diào)用SQLAllocHandle ( SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc )獲得連接句柄,V_OD_hdbc就是要分配的SQLHDBC類型的連接句柄。
分配好之后,我們可以調(diào)用SQLSetConnectAttr ( V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0 )來設(shè)定連接超時(shí)參數(shù)。
第三:連接數(shù)據(jù)庫
調(diào)用SQLConnect ( V_OD_hdbc, (SQLCHAR*) "Test", SQL_NTS, (SQLCHAR*) "root", SQL_NTS, (SQLCHAR*) "", SQL_NTS )連接我前面提到的數(shù)據(jù)庫,需要設(shè)定三個(gè)參數(shù),就是數(shù)據(jù)庫名稱、用戶名和密碼(因?yàn)槲业臄?shù)據(jù)庫密碼為空,所以這里的密碼也為空),后面的SQL_NTS的位置應(yīng)該寫入這些參數(shù)的長(zhǎng)度,如果寫的是SQL_NTS就是讓SQLConnect來決定參數(shù)的長(zhǎng)度。
第四:分配SQL語句的句柄并進(jìn)行查詢:
需要聲明一個(gè)SQL語句的句柄(SQLHSTMT),用來存放SQL語句信息的,調(diào)用SQLAllocHandle ( SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt )來獲得這個(gè)句柄,V_OD_hstmt就是我們要分配的SQLHSTMT類型的SQL語句句柄。
我們的查詢語句是:
SELECT name, id FROM web ORDER BY id
執(zhí)行這條查詢語句之后,查詢結(jié)果可能有很多行,但每行只有兩列,分別對(duì)應(yīng)name和id,它們的數(shù)據(jù)類型為integer和char*,在ODBC中的數(shù)據(jù)類型標(biāo)識(shí)符為SQL_C_ULONG和SQL_C_CHAR。我們需要先聲明這樣的兩個(gè)變量來存貯查詢結(jié)果:
SQLINTEGER V_OD_id;
char V_OD_buffer[200];
然后我們需要使用SQLBindCol函數(shù)把查詢結(jié)果和我們定義的變量進(jìn)行綁定:
SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,150,&V_OD_err);
SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,150,&V_OD_err);
這里的V_OD_err是用來存放錯(cuò)誤信息編號(hào)的變量,類型也是SQLINTEGER。
接下來,我們調(diào)用SQLExecDirect來進(jìn)行查詢:
SQLExecDirect ( V_OD_hstmt, "SELECT dtname,iduser FROM web order by iduser", SQL_NTS );
我們可以用SQLNumResultCols ( V_OD_hstmt, &V_OD_colanz )來獲得結(jié)果的列數(shù),也可以用SQLRowCount( V_OD_hstmt, &V_OD_rowanz )來獲得結(jié)果的條數(shù),V_OD_colanz和V_OD_rowanz分別存儲(chǔ)相應(yīng)的結(jié)果,類型分別為SQLSMALLINT和SQLINTEGER。
在讀取結(jié)果之前,我們需要調(diào)用SQLFetch ( V_OD_hstmt )語句,這個(gè)語句可以用來獲得條結(jié)果也可以用來都下一條,有點(diǎn)像next的感覺。然后我們就可以在V_OD_id和V_OD_buffer里面獲得每條記錄的結(jié)果了。
第五:關(guān)于關(guān)閉連接和釋放句柄
關(guān)閉數(shù)據(jù)庫的連接,調(diào)用SQLDisconnect ( V_OD_hdbc )就可以了,但在關(guān)閉數(shù)據(jù)庫之前需要先釋放SQL語句的句柄,而且在關(guān)閉數(shù)據(jù)庫之后應(yīng)該釋放連接句柄和ODBC環(huán)境句柄,語句如下(按正常的順序):
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
第六:關(guān)于上述情況中的錯(cuò)誤信息處理
我們需要定義兩個(gè)變量:
long V_OD_erg;
SQLINTEGER V_OD_err;
SQLAllocHandle、SQLSetEnvAttr、SQLSetConnectAttr、SQLConnect、SQLExecDirect、SQLNumResultCols和SQLRowCount的調(diào)用結(jié)果都可以用V_OD_erg來存儲(chǔ),V_OD_err可以獲得SQLBindCol中的錯(cuò)誤信息。
第七:獲得本機(jī)的DSN信息
我們可以在聲明SQLHENV句柄之后,使用SQLDataSources函數(shù)來獲得本機(jī)的DSN信息。程序如下:
void OD_ListDSN(void)
{
char l_dsn[100],l_desc[100];
short int l_len1,l_len2,l_next;
l_next=SQL_FETCH_FIRST;
while( SQLDataSources(V_OD_Env,l_next,l_dsn, sizeof(l_dsn),
&l_len1, l_desc, sizeof(l_desc), &l_len2) == SQL_SUCCESS)
{
printf("Server=(%s) Beschreibung=(%s)
",l_dsn,l_desc);
l_next=SQL_FETCH_NEXT;
}
}
l_next變量是用來指定我們所要獲得的DSN的類別:
SQL_FETCH_FIRST 設(shè)定SQLDataSources()函數(shù)找到個(gè)可用的數(shù)據(jù)源(可以是User DSN,也可以是Systerm DSN)
SQL_FETCH_FIRST_USER 設(shè)定SQLDataSources()函數(shù)找到個(gè)User DSN
SQL_FETCH_FIRST_SYSTEM 設(shè)定SQLDataSources()函數(shù)找到個(gè)System DSN
SQL_FETCH_NEXT 找到下一個(gè)數(shù)據(jù)源,至于數(shù)據(jù)源類型則要根據(jù)前面的定義
到這里,我們?cè)赨nix的C語言下面進(jìn)行ODBC編程已經(jīng)講完,上述ODBC API需要引用以下幾個(gè)頭文件(這些文件已經(jīng)安裝到/usr/include下了):
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
另外如果大家使用GTK進(jìn)行編程,由于到目前為止GTK還沒有加入專門處理數(shù)據(jù)庫的部件,所以大家可以在GTK中調(diào)用上述的ODBC API即可。
這里附上例程供大家參考學(xué)習(xí):
/* odbc.c
testing unixODBC
*/
#include <stdlib.h>
#include <stdio.h>
#include <odbc/sql.h>
#include <odbc/sqlext.h>
#include <odbc/sqltypes.h>
SQLHENV V_OD_Env; // Handle ODBC environment
long V_OD_erg; // result of functions
SQLHDBC V_OD_hdbc; // Handle connection
char V_OD_stat[10]; // Status SQL
SQLINTEGER V_OD_err,V_OD_rowanz,V_OD_id;
SQLSMALLINT V_OD_mlen,V_OD_colanz;
char V_OD_msg[200],V_OD_buffer[200];
int main(int argc,char *argv[])
{
// 1. allocate Environment handle and register version
V_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHandle
");
exit(0);
}
V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SetEnv
");
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
// 2. allocate connection handle, set timeout
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHDB %d
",V_OD_erg);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
// 3. Connect to the datasource "web"
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "Test", SQL_NTS,
(SQLCHAR*) "root", SQL_NTS,
(SQLCHAR*) "", SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %d
",V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1,
V_OD_stat, &V_OD_err,V_OD_msg,100,&V_OD_mlen);
printf("%s (%d)
",V_OD_msg,V_OD_err);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Connected !
");
V_OD_erg=SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Fehler im AllocStatement %d
",V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
printf("%s (%d)
",V_OD_msg,V_OD_err);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,150,&V_OD_err);
SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,150,&V_OD_err);
V_OD_erg=SQLExecDirect(V_OD_hstmt,"SELECT dtname,iduser FROM web order by iduser",SQL_NTS);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error in Select %d
",V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
printf("%s (%d)
",V_OD_msg,V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
V_OD_erg=SQLNumResultCols(V_OD_hstmt,&V_OD_colanz);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Number of Columns %d
",V_OD_colanz);
V_OD_erg=SQLRowCount(V_OD_hstmt,&V_OD_rowanz);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Number of RowCount %d
",V_OD_erg);
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
printf("Number of Rows %d
",V_OD_rowanz);
V_OD_erg=SQLFetch(V_OD_hstmt);
while(V_OD_erg != SQL_NO_DATA)
{
printf("Result: %d %s
",V_OD_id,V_OD_buffer);
V_OD_erg=SQLFetch(V_OD_hstmt);
} ;
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
return(0);
}
2.QT下進(jìn)行ODBC編程
QT 3.0提供了Data Table、Data Browser和Data View三個(gè)與數(shù)據(jù)庫相關(guān)的控件。你可以在QT的Project設(shè)置你要連接的數(shù)據(jù)庫,Driver一欄中選擇QODBC3即可,其它選項(xiàng)你一看就明白了。上述的三個(gè)數(shù)據(jù)庫控件的使用方法可以參見QT中相應(yīng)文檔,也很好使用的。
參考資料:
1. 微軟的ODBC主頁:http://www.microsoft.com/data/odbc/;
2. UnixODBC的主頁:http://www.unixodbc.org;
3. FreeODBC的主頁:http://www.jepstone.net/FreeODBC/;
4. EasySoft的主頁:http://www.easysoft.com;
5. TrollTech的QT 3.0文檔主頁:http://doc.trolltech.com/3.0/。
Linux/Unix下ODBC的安裝、配置與編程
更新時(shí)間: 2007-06-07 09:12:05來源: 粵嵌教育瀏覽量:1021
粵嵌動(dòng)態(tài)
推薦閱讀
- ·Linux字符設(shè)備驅(qū)動(dòng)框架解析:file_operations的核心作用與實(shí)現(xiàn)
- ·廣東朝歌數(shù)碼科技股份有限公司專場(chǎng)招聘會(huì)
- ·深化產(chǎn)教融合,共筑技能人才培養(yǎng)新生態(tài) —— 廣州華立學(xué)院到訪粵嵌從化校區(qū)為深化產(chǎn)教
- ·校企合作新突破 | 粵嵌科技與三亞學(xué)院共探產(chǎn)教融合新路徑
- ·粵嵌科技入選國(guó)家級(jí)職業(yè)數(shù)字展館聯(lián)合建設(shè)單位,賦能計(jì)算機(jī)程序設(shè)計(jì)員高技能人才培養(yǎng)
- ·嵌入式實(shí)時(shí)操作系統(tǒng)的性能優(yōu)化與實(shí)現(xiàn)路徑
- ·校企攜手賦能教育!粵嵌科技助力海南科技職業(yè)大學(xué)探索 AGI 時(shí)代教學(xué)新范式
- ·嵌入式系統(tǒng)中的低功耗設(shè)計(jì)策略與實(shí)現(xiàn)路徑
- ·深圳市軒宇軟件開發(fā)有限公司專場(chǎng)招聘會(huì)
- ·嵌入式系統(tǒng)中的代碼空間優(yōu)化:策略與實(shí)踐