Microsoft Excel是用戶經常使用的制表工具,它可以用ODBC很方便地得到AS/400上的DB2數據。具體操作如下(操作步驟用WIN2000+Office2000環境描述,用戶已配置好ODBC數據源):
1.打開Microsoft Excel,建立一個新表。
2.打開“數據”->“獲取外部數據”->“新建數據庫查詢”菜單,如圖1所示。
圖13.選中以創建好的ODBC數據源(如as400db2),按“確定”按鈕,輸入用戶名、口令後,彈出“查詢向導”畫面,如圖2所示。
圖24.在圖2中選中你要查詢的物理文件並將需要的字段選到“查詢結果中的列”中,如圖3所示。
圖35.點擊“下一步”,對數據進行篩選。(此例中,沒有篩選操作),如圖4所示。
圖46.點擊“下一步”,確定關鍵字。(此例中,沒有選關鍵字),如圖5所示。
圖57.點擊“下一步”,進入圖6所示的畫面,選“將數據返回Microsoft Excel(R)”。
圖68.點擊“完成”,將數據采集到Microsoft Excel中,如圖7所示。
圖7 ∩銜奈頤翹致哿巳绾臥贠DBC數據源裡配置數據庫,通過這種方式,應用程序的編寫變的簡單。只需要在應用程序裡面指定已經配置好的數據源就可以連接,訪問數據庫。但是,這種方式也有一定的局限性,需要手工的在ODBC數據源裡面配置。需要教會程序的使用者如何去配置,而且,如果一不小心更改了ODBC數據源的配置(也許是無意的)。就會造成連接數據庫失敗。這時候,程序的使用人員也許會一籌莫展,束手無策。本教程中,我們將學習使用ODBC APIs的細節.
因為我們的程序並不與ODBC驅動程序直接通信,而是通過ODBC管理器來定義一系列APIs供你的程序調用以完成工作,所以我們需要包含odbc32.inc和odbc32.lib文件,當然還有Windows.inc。
連接數據源需要以下幾步:
當連接完成時,必須通過以下步驟來關閉和銷毀它:
在ODBC 3.x版本以前,我們需要調用很多獨立的函數來分配環境、連接和語句句柄(SQLAllocEnv, SQLAllocConnect, SQLAllocStmt).而在ODBC 3.x中, 這些函數被SQLAllocHandle所代替,語法如下:
SQLRETURN SQLAllocHandle( SQLSMALLINT HandleType,SQLHANDLE InputHandle,SQLHANDLE * OutputHandlePtr);
看上去挺麻煩,簡化一下看看:
SQLAllocHandle proto HandleType:DWord,
InputHandle:DWord,
OutputHandlePtr:DWord
SQLRETURN 被定義為SQLSMALLINT類型.而 SQLSMALLINT被定義為短整型,例如一個字(16 bits). 所以該函數的返回值在ax中,而不是 eax. 這是很重要的.但是Win32下函數的參數是通過32位堆棧來傳送的.即使這個參數只是一個字長(16位),它也應被擴展為32位.這就是為什麼HandleType被說明為雙字(dword)而不是字(word).看一下導入庫 odbc32.lib,SQLAllocHandle的入口是_SQLAllocHandle@12. 就是說這個函數的參數的組合長度為12字節(3 dWords).然而,這不是說C函數的原型不對. SQLAllocHandle會只用HandleType的底位字並忽略高位字.因此C函數原型是功能上(functionally)正確而我們的匯編函數原型反映了實際.
結束了SQL類型的討論,我們來看一看函數的參數和返回值。.
描述符是一個數據集合描述了一個SQL語句的參數或一個結果集的列數, 視應用程序或驅動程序而定。
SQLAllocHandle 可能的返回值如下:
SQL_SUCCESS 函數成功完成. SQL_SUCCESS_WITH_INFO 函數成功完成,但帶回非致命錯誤或警告. SQL_ERROR 函數調用失敗. SQL_INVALID_HANDLE 傳送給函數的句柄非法.無論函數的調用成功還是失敗,我們都可通過調用SQLGetDiagRec或SQLGetDiagFIEld函數來獲得更多的信息.它們與Win32 API中的GetLastError很相似.
例子:
.data?
hEnv dd ?
.code
invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_HANDLE_NULL, addr hEnv
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
分配完環境句柄後,我們需要設置一個環境屬性SQL_ATTR_ODBC_VERSION以適當的值.設置環境屬性可通過調用函數SQLSetEnvAttr.你也許猜到了,還有類似的函數如 SQLSetConnectAttr和SQLSetStmtAttr. SQLSetEnvAttr原型如下:
SQLSetEnvAttr proto EnvironmentHandle:DWord,
Attribute:DWord,
ValuePtr:DWORD, StringLength:DWord
這個函數的返回值與SQLAllocHandle相同.
例子:
.data?
hEnv dd ?
.code
invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_HANDLE_NULL, addr hEnv
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
invoke SQLSetEnvAttr, hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, NULL
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
這一步與分配環境句柄相似,我們可以通過調用SQLAllocHandle函數並賦以不同的參數值來完成.
例子:
.data?
hEnv dd ?
hConn dd ?
.code
invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_HANDLE_NULL, addr hEnv
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
invoke SQLSetEnvAttr, hEnv, SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3, NULL
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
invoke SQLAllocHandle, SQL_HANDLE_DBC, hEnv, addr hConn
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
我們現在要通過特定的ODBC驅動程序來連接數據源.通過這三個ODBC函數來達成這個目標.它們為我們提供了好幾層"選擇".
SQLConnect Core 這是最簡單的函數。它只需要數據源名(DSN,Data source name)和可選的用戶名和密碼.它不提供任何GUI選項例如向用戶顯示一個對話框來提供更多信息。如果你已經有了需要使用的數據庫的DSN就可以使用這個函數. SQLDriverConnect Core 這個函數提供了較SQLConnect更多的選擇.我們可以連接一個沒有在系統信息內定義的數據源。如沒有DSN.另外,我們可以指定這個函數是否需要顯示一個對話框來為用戶提供更多信息.例如,如果用戶遺漏了數據庫的名字,它會指導ODBC驅動程序顯示一個對話框,讓用戶來選擇想連接的數據庫. SQLBrowseConnect Level 1 這個函數允許在運行時(RunTime)枚舉數據源.比SQLDriverConnect更加靈活。因為可以多次順序調用SQLBrowseConnect,而每次提供給使用者更多的專用信息直到最後獲得需要的連接句柄.我將先檢查SQLConnect函數.要使用 SQLConnect,你應先知道什麼是DSN. DSN是數據源名(Data Source Name)的縮寫,是一個唯一標識某數據源的字符串。一個DSN標識了一個包含了如何連接某一特定的數據源的信息的數據結構.這個信息包括要使用何種ODBC驅動程序及要連接哪個數據庫.我們可以通過控制面板中的32位ODBC數據源來創建、修改及刪除DSN.
SQLConnect的語法如下:
SQLConnect proto ConnectionHandle:DWord
pDSN:DWord,
DSNLength:DWord,
pUserName:DWord,
NameLength:DWord,
pPassword:DWord,
PasswordLength:DWord
在最小情況下, SQLConnect 需要連接句柄,DSN和DSN的長度。如果數據源不需要的話,用戶名和密碼就不是必須的.函數的返回值與SQLAllocHandle的返回值相同.
假設我們的系統中有一個叫做"Sales" 的DSN並且我們想連接這個數據源.我們可以這樣做:
.data
DSN db "Sales",0
.code
......
invoke SQLConnect, hConn, addr DSN, sizeof DSN,0,0,0,0
SQLConnect 的缺點是:在連接一個數據源之前,我們必須創建它的DSN. SQLDriverConnect 提供了更大的靈活性.它的語法如下:
SQLDriverConnect proto ConnectionHandle:DWord,
hWnd:DWord,
pInConnectString:DWord,
InStringLength:DWord,
pOutConnectString:DWord,
OutBufferSize:DWord,
pOutConnectStringLength:DWORD, DriverCompletion:DWord
例子:
.data
strConnect db "DBQ=c:\data\test.mdb;DRIVER={Microsoft Access Driver (*.mdb)};",0
.data?
buffer db 1024 dup(?)
OutStringLength dd ?
.code
.....
invoke SQLDriverConnect, hConn, hWnd,
addr strConnect, sizeof strConnect, addr buffer, sizeof buffer,
addr OutBufferLength, SQL_DRIVER_COMPLETE
在連接順利完成後,我們就可以對數據源進行查詢及其他操作.這些將在下一節討論.現在假設我們已完成了對數據源的操作,就可以通過調用SQLDisconnect來斷開與它的連接. 這個函數非常簡單(就象那悲傷而冷酷的現實:毀滅總比創造容易的多).它只需要一個參數:連接句柄。
invoke SQLDisconnect, hConn
在順利地斷開連接後,我們現在可以調用SQLFreeHandle函數來銷毀連接句柄和環境句柄. 這是由ODBC 3.x提供的新函數.它替代了SQLFreeConnect, SQLFreeEnv及SQLFreeStmt函數. SQLFreeHandle語法如下:
SQLFreeHandle proto HandleType:DWORD, Handle:DWord
For example:
invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn
invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv在使用 VC、 VB、 Delphi等高級語言編寫數據庫應用程序時,往往需要用戶自己在控制面板中配置 ODBC數據源。對於一般用戶而言,配置 ODBC數據源可能是一件比較困難的工作。而且,在實際應用中,用戶往往要求在同一個應用程序中訪問不同的數據源,因此采用一般的加載方法就有了無法克服的缺陷。為能在程序中完成這一工作,方便應用程序的使用,本文以 VC為開發環境介紹兩種在應用程序中動態加載 ODBC系統數據源的方法。
方法一:修改注冊表
設計思路
一般情況下,當用戶在控制面板中配置好 ODBC數據源後, Windows系統便在注冊表中加入了一些子鍵來存儲用戶的配置結果。當應用程序需要用到數據源時, Windows便會通知底層接口查閱注冊表中該數據源的配置。如果用戶刪除了某個 ODBC數據源,那麼也會在注冊表中有所反應。如果配置的數據源是用戶數據源, Windows系統便會修改注冊表的 HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI子鍵;如果配置的數據源是系統數據源, Windows系統便會修改注冊表的 HKEY_LOCAL_MacHINE\SOFTWARE\ODBC\ODBC.
INI主鍵。因此,我們可以在應用程序中使用 Windows API中的注冊表編輯函數來完成 Windows所做的工作,這樣就可以達到動態加載數據源的目的。具體實現對於不同類型的數據源,注冊表的修改也各有不同,但基本上都要修改兩個地方。一個是在 ODBC.INI子鍵下建立一個與數據源描述名同名的子鍵,並在該子鍵下建立與數據源配置相關的項;另一個是在 \ODBC.INI\ODBC Data Sources子鍵下建立一個新項以便告訴驅動程序管理器 ODBC數據源的類型。下面以配置一個 Microsoft Access數據源為例給出實現此功能的函數的代碼。
/* strSourceName是要創建的數據源名, strSourceDb是數據庫存放路徑, strDescription是數據源的描述字符串。* /
BOOL CLoadOdbcDlg:: LoadDbSource(CString strSourceName,CString strSourceDb, CString strDescription)
{
//存放打開的注冊表鍵
HKEY hKey;
DWord dw;
//存放注冊表 API函數執行的返回值
LONG lReturn;
//存放要打開的子鍵
CString strSubKey;
//檢測是否安裝了 MS Access ODBC driver:odbcjt32.dll
//獲得 Windows系統目錄
char sysDir[MAX_PATH];
char drvName[]=" \\odbcjt32.dll" ;
::GetSystemDirectory (sysDir,MAX_PATH);
strcat(sysDir,drvName);
CFileFind findFile;
if(!findFile.FindFile (sysDir))
{
AfxMessageBox("您的計算機系統中沒有安裝 MS Access的 ODBC驅動程序 odbcjt32.dll,您將無法加載該類數據源。 " ,MB_OK|MB_ICONSTOP);
return false;
}
strSubKey=" SOFTWARE\\ODBC\\ODBC.INI\\"+ strSourceName;對於管理信息系統和數據庫應用系統的開發,人們往往根據實際需求采用不同的數據庫系統。應用這些系統,各單位各部門投入了大量的人力、物力,相繼完成了一些管理系統。現在,當人們希望提高整個管理水平,建立全集團、全公司的企業級信息管理系統時發現,以往已完成的各部門系統采用的是不同的DBMS,要想統一起來,非常困難,甚至是不可能的。因此,為了保護過去的投資,利用已建立的信息系統,迫切需要一種能訪問多種數據庫的操作平台,以便建立更大、更完備、更全面的企業信息管理系統。
為了適應這種需求,Microsoft推出了開放數據庫互連技術,簡稱ODBC。開放數據庫互連接實際上是一個數據庫訪問庫,它包含訪問不同數據庫所要求的ODBC驅動程序。如要操作Fo xpro數據庫,要用Foxpro的ODBC驅動程序;要訪問DBASE,要用DBase的ODBC驅動程序。總之,應用程序要操作不同類型的數據庫,只要調用ODBC所支持的函數,動態鏈接到不同的驅動程序上即可。隨著ODBC技術的推出,許多開發工具軟件都把ODBC技術集成到自己的軟件中,如,Visu al basic、Visual C++、Power Builder等等。其中,由PowerSoft公司開發的PowerBuilder 是迄今為止最成功的數據庫應用系統開發工具,它利用ODBC技術不僅適應各種數據庫系統,而且采用面向對象的開發方法和可視化的編程環境,使PowerBuilder成為優秀的前端開發工具,日益受到人們的重視。
本文將主要討論在Power Builder中,以不同的方法,應用ODBC技術,去訪問不同的數據庫。
在實際應用中,可能會以幾種不同的方式訪問數據庫:只訪問一個數據庫、在多個數據庫間動態切換、同時需要訪問多個數據庫。這些方式,都可以應用ODBC技術滿足用戶的要求。下面分別討論每種方式應用ODBC具體方法。假定所需要的ODBC驅動程序已經正確安裝。
一、只訪問單一數據庫
這是一種比較簡單的ODBC應用。應用程序只需要訪問單一的數據庫,采用Power Builde r的畫筆,就可以完成相應的ODBC設置。下面以
Foxpro為例,說明這一過程:
1.配置ODBC
·單擊Power Panel上的ODBC畫筆,出現ODBC設置窗口。
·在in stalled driver窗口選中Foxpro Files。
·單擊Create按鈕,出現ODBC Foxpro Setup窗口,在Data source Name欄,定義數據源名,如:C-foxpro。
·選擇Foxpro 2.5。
·選擇Foxpro表所在的目錄及索引文件。
·以上參數定義完後,單擊OK。返回Configure ODBC窗口。
·在數據源框中,可看到剛剛定義的C-Foxpro出現,選中它。
·單擊Done按鈕。此時,ODBC驅動程序及數據源定義完成。
2.連接數據源
·單擊DB PROFILE畫筆,出現Database Profile窗口。
·如果設有與FOxpro相關的PROFILE,單擊NEW,建立一個。建立PROFILE後,返回Databas e Pro-file窗口。選中新定義的PROFILE;如果有,則選擇該PROFILE。
·單擊OK,則建立了與指定數據庫的ODBC連接。
此後,在設計Power Builder的應用程序時,所有對數據庫的操作都連接到Foxpro。在此要特別說明的是,雖然只訪問一種類型的數據庫,但是對於同一個數據庫,可以建立多個數據源。Power Builder規定,每個ODBC數據源必須有一個唯一的名字,可以使用不同的連接參數,使多個數據源連接到同一個數據庫。比如,兩個數據源使用不同的PASSWord和USERID,都連接到Foxpro。二、在多個數據庫間動態切換
在設計企業級的信息管理系統時,常常會遇到需要訪問不同數據庫系統的問題。比如人事部門的人事檔案是應用Foxpro數據庫系統,財務部門的財務信息是應用DBase數據庫系統, 因此,企業信息管理系統就要求必須具有能夠訪問多種數據庫的能力,而且可以根據程序要求,在多種數據庫間動態切換。應用Power Builder提供的PowerScript設計語言,通過ODBC,可以很方便地達到這個目的。
為了解決應用程序和數據庫之間的通訊,Power-Builder使用一個特殊的對象,這個對象稱作事務對象(TRANSACTION OBJECT)。象所有的對象一樣,事務對象也具有自己的事件、屬性和函數。在使用事務
對象之前,必須先建立對象,並且給事務對象的屬性賦值。ODBC使用事務對象中有兩個重要屬性:DBMS和DbParm。DBMS用來指明要連接的數據源,如果使用ODBC技術,則賦給屬性DBMS的值是"ODBC"。Db-Parm為DBMS的說明性參數,它的值是連接數據庫所需要的參數組成的字符串,該值必須指明DSN(DATA SOURCE NAME)值,DSN值告訴ODBC要存取的數據源。可以說,一個事務對象標識了一個數據庫,因此,它必須在存取該數據庫前就要建立。為了方便用戶的應用,Power Builder還提供了一個全局的缺省事務對象,即每當應用程序啟動時,Power Builder都要自動建立一個稱作SQLCA(SQL COMMUNICATION AREA)的事務對象,不需要用戶建立。當一個應用程序初始啟動時,連接數據庫所需的缺省信息都是存放在初始化文件PB.INI中。
下面是在PB.INI文件中用於與Foxpro數據庫連接的部分。
[Database]
Vendors=ODBC,SYS Sybase system 10
DBMS=ODBC
ServerName=
Database=
UserId=
....
[DBMS_PROFILES]
CURRENT=Foxpro
PROFILES="Foxpro","DBase"
....
[Profile Foxpro]
DBMS=ODBC
DataBase=c:\fox
UserId=Public
DatabasePassWord=
LogpassWord=
ServerName=
DbParm=ConnectString=‘DSN=C_Foxpro;D
BQ=C:\fox;FIL=Foxpro 2.5;
在上述的PB.INI中的Profile Foxpro段,指出了DBMS是ODBC,DbParm指明了要連接的數據源名是C_Foxpro。對於一個ODBC數據庫來說,DbParm字符串包含了連接所需要的全部信息。一般情況下,要在多個數據庫間動態切換,只有一個缺省的SQLCA事務對象就夠了。當需要切換到其它ODBC數據庫時,可以應用Script語言,改變SQLCA事務對象的屬性,完成切換。比如: 當需要切換到DBase數據庫時,可以插入如下Script語句。
SQLCA.DBMS="ODBC"
SQLCA.DbParm="Connectstring=‘DSN=cDBase;DBQ=c:\db4;fil=
DBase4’"
CONNECT USING SQLCA;
當需要再切換到Foxpro時,再插入如下Scrift語句:
SQLCA.DBMS="ODBC"
SQLCA.Dbpram="Connectstring=‘DSN=C_Foxpro;DBQ=C:\fox;FI
L=Foxpro 2.5;’"
CONNECT USING SQLCA;
由於SQLCA是缺省的事務對象,所以CONNECT語句可以不指出事務
對象的名字,只寫CONNE CT即可。三、同時訪問多個數據庫
當需要在一個應用中同時訪問多個數據庫時,就要用到多個事務對象。可以用SQLCA與一個數據庫連接,但是對於其它的數據庫,每個庫則必須建立一個事務對象。在創建事務對象前,應考慮它的使用范圍,可根據需要聲明為全局對象或實例對象。
下面以在一個應用中需同時操作Foxpro和Access兩種數據庫為例,說明創建事務對象的過程。該例要在同一個數據窗口中同時顯示Foxpro中的AA表和Access中的BB表,PowerScrip t語句如下:
∥聲明事務對象
Transaction Tr_foxpro
Transaction Tr_Access
∥建立事務對象
Tr_foxpro=Create Transaction
Tr_Access=Create Transaction
∥給事務對象的屬性賦值
Tr_foxpro.DBMS="ODBC"
Tr_foxpro.Dbparm="ConnectString=‘DSN=S_foxpro"
Tr_Access.DBMS="ODBC"
Tr_access.Dbparm="ConnectString"=‘DSN=S_Access"
∥建立數據庫連接
Connect Using Tr_foxpro
Connect Using Tr_Access
要在一個窗口中定義二個不同的數據窗口分別對應二個不同的庫,首先要按前述的步驟建立各自的數據源,設數據源名分別為S_foxpro和S_Access。然後在各自的數據源下制作數據窗口。在窗口OPEN事件中寫入如下Script程序:
∥建立數據窗口與事務對象的連接
Dw_1.Settransobject(Tr_foxpro)
Dw_2.Settransobject(Tr_Access)
∥將數據庫中的數據檢索到數據窗口中
Dw_1.RetrIEve()
Dw_2.RetrIEve()
當這個應用程序執行時,就會在兩個數據窗口顯示兩個數據庫的內容,讀者可以仿照以上的方法,設計出同時訪問多個不同數據庫的程序。
以上闡述的是應用ODBC訪問不同數據庫的方法,Power Builder實際上還提供另一種方法訪問數據庫,即專用數據接口,它的使用方法與ODBC有類似之處,讀者可參考本文,理解專用數據接口方法。
ASP賦予你在標准的Html文檔中嵌入腳本的能力。使用這些腳本可執行應用程序邏輯和調用執行特定任務的軟件組件,如數據庫查詢、文件輸入/輸出(I/O)、交易規則和工作流程。ASP將INTERNET數據庫連接器(IDC)的簡單性與ISAPI的靈活性結合在一起,而且由於支持Java虛擬主機,因此可以用多種編程語言編寫ASP應用組件。CGI是最常用的WEB服務器擴展。CGI可以使你能夠運行在不屬於WEB服務器的應用程序。許多CGI應用程序是用腳本語言編寫的。由於這種語言的可移植性,因此這些語言是擴展WEB服務器性能的流行方法。經過CGI具有靈活性和可移植性,但是由於CGI必須對每個CGI請求重新啟動一個新的進程,所以,PERL應用程序對大流量的WEB站點不是最佳解決方案。在CGI完成對該請求的服務後,將取消該進程以及與它相關的任何信息。現在國內外的虛擬主機服務商,在NT SERVER下已經不提供支持PERL的服務。
ISAPI是由MS創建的作為CGI補充的INTERNET服務器應用程序編程接口,是一組常規可擴展例程,用於調用外部應用程序並處理浏覽器和服務器之間的數據流。
ISAPI是一個開放式規范,WINDOWNS NT和其他操作系統上的第三方WEB服務器支持該規范。通過將ISAPI與IIS和NT SERVER結合,可以創建一個高性能、低成本並且可擴展的超文本傳輸協議(HTTP)平台。ISAPI開發以ISAPI應用程序的形式出現,用於克服CGI性能不足的問題。ISAPI的過濾器可以對傳入和傳出IIS的信息進行預處理和後處理。雖然ISAPI比CGI更快更靈活,但是程序員必須十分熟悉MS VC++開發系統才行。ODBC IDC是IIS中的另一個可擴展的選項。IDC是一個ISAPI應用程序,它使你可以把WEB頁面與支持ODBC的任何後端數據庫結合。IDC使用簡單的腳本語言創建數據庫連接這個事實使IDC成為特別受歡迎的服務器擴展。了解結構化查詢語言(SQL)可以幫助你創建IDC應用程序頤親亓薓icrosoft的MSDN裡面對ODBC的介紹:
Mcrosoft推出的ODBC(Open Database Connectivity)技術為異質數據庫的訪問提供了統一的接口。ODBC基於SQL(Structured Query Language),並把它作為訪問數據庫的標准。這個接口提供了最大限度的相互可操作性:一個應用程序可以通過一組通用的代碼訪問不同的數據庫管理系統。一個軟件開發者開發的客戶/服務器應用程序不會被束定於某個特定的數據庫之上。ODBC可以為不同的數據庫提供相應的驅動程序。
ODBC的靈活性表現在以下幾個方面:
- 應用程序不會受制於某種專用的API
- SQL語句以源代碼的方式直接嵌入在應用程序中
- 應用程序可以以自己的格式接收和發送數據
- ODBC的設計完全和ISO Call-Level Interface兼容
- 現在的ODBC數據庫驅動程序支持55家公司的數據產品
因為很多朋友不太熟悉ODBC,做了簡單的介紹之後,我們先來解釋一些與ODBC有關的名詞。
ODBC驅動程序:是一個動態鏈接庫(DLL),用以將特定的開放式數據庫連接的數據源和另一個應用程序(客戶端)相連接。
ODBC數據源:作為數據源使用的數據庫或數據庫服務器。ODBC數據源通過它們的數據源名稱來引用,或者通過具體引用ODBC驅動程序和服務器名稱來引用。可以在Windows的控制面板中使用ODBC管理程序或rdoRegisterDataSource(一個ODBC API)方法來注冊命名的數據源。
ODBC驅動程序管理器:提供從主機語言到特定後端數據源驅動程序的接口。
ODBC API:數據庫廠商為程序設計者提供的直接訪問數據庫的一組函數。注意:這裡要指出的是,雖然ODBC API提供了很多很方便而且強大的功能。但是通常來說ODBC API都比較難學,而且使用很容易出錯。雖然允許用ODBC API來操作ODBC句柄,但還是要小心,如果不正確地使用ODBC API,可能會導致不可預知的錯誤。例如,假如使用ODBC API代碼來關閉連接或釋放這些ODBC句柄中的任何一個,那麼RemoteData控件或RDO的行為將是不可預知的。保存ODBC句柄以供備用也是沒有意義的,因為它們是可變的。 這是使用 win32asm進行數據庫編程系列的第一份教程。在如今的IT界,數據庫編程變的越來越重要,所以我們不能再忽視它。但如今有很多種數據庫在使用,如果我們為了實現win32下數據庫匯編語言編程而學習各種數據庫文件格式,所花時間大概稱得上“永恆”。幸運的是,Microsoft的一項技術使得我們得以擺脫這個大麻煩。它被稱為ODBC,是開放式數據庫互連(Open Database Connectivity)的縮寫,這是一族API,與Windows API相似。它主要與數據庫打交道。就是說,利用ODBC API,你可通過統一界面和好多各不相同的數據庫打交道。
ODBC是如何工作的?它的結構式怎樣的?在使用ODBC之前,你應對它的結構有一個清楚的了解。 ODBC有四個組成部分:
- 應用程序 (Application,你的程序)
- ODBC 管理器 (ODBC manager)
- ODBC 驅動程序(ODBC Drivers)
- 數據源 (Data Sources,數據庫)
這四個組件的核心是ODBC 管理器。 你可把它想象成你的監工。你告訴它你希望他作什麼,然後它把你的要求傳達給它的工人(ODBC 驅動程序)並完成工作。如果工人有什麼想告訴你的,它會與監工(ODBC 管理器)說,由監工傳達給你。工人們很明白他們應作什麼,因此他們會為你很好的完成工作。
通過這樣的模式,我們並不與數據庫驅動程序直接通信。你只需告訴數據庫管理器你想要做什麼。而使用恰當的ODBC驅動程序來實現你的目的則是ODBC管理器的事。每個ODBC 驅動程序對於它所對應的數據庫均有足夠了解。各部件各司其職,極大的簡化了工作量。
你的程序<----> ODBC管理器<----> ODBC驅動程序 <----> 數據庫
ODBC管理器由Microsoft提供。看一下你的控制面板。如果你正確地安裝了ODBC你會找到ODBC數據源(32位) 項目。 至於ODBC驅動程序, Microsoft隨他們的產品提供了好幾種。並且你總可從數據庫提供商那裡獲得新的ODBC 驅動程序。只要簡單地安裝新的ODBC驅動程序,你的機器就可使用新的它以前不知道的數據庫。
ODBC APIs 使用很簡單,但你需要知道一些關於SQL和數據庫的知識。例如字段(fIEld),主鍵(Prima(最完善的虛擬主機管理系統)ry key),記錄(record),列(column),行(row)等。我須假定你已知道數據庫理論的一些基礎知識,這樣我才能討論win32下用匯編語言進行ODBC編程的細節問題。正如你所看到的,ODBC 管理器試圖在你的程序裡隱藏實現的細節。這意味著它必須提供某些基本界面來與你的程序和ODBC驅動程序進行通訊。 由於ODBC驅動程序在某些性能方面存在著差異,因此必須存在一種方法,以使得我們的程序能夠知道某個ODBC驅動程序是否支持某一特性。 ODBC定義了被稱為Interface Conformance Levels的三層服務界面。第三層是核心層。任何ODBC驅動程序都要象在第一層和第二層實現功能一樣實現核心層表中的所有特性。從我們的程序的眼光來看, ODBC APIs被分割為這樣的三層。如果某個函數被標為核心的,就意味著你可放心使用而不必擔心它是否為你正使用的ODBC驅動程序支持。如果它是一個第一層或第二層的函數,你就得確認ODBC驅動程序是否支持,然後再使用。你可通過MSDN獲得ODBC APIs的詳細資料。
在編寫代碼之前你應了解一些ODBC的名詞。
- 環境(Environment). 和字面意思一樣,是一個全局文本用來存取數據。如果你熟悉DAO的話,你可把它想象為一個workspace。它包含應用於所有ODBC session的信息,例如一個session的connections句柄。在用ODBC之前你必須從環境中獲得這個句柄。
- 連接(Connection). 指定ODBC驅動程序和數據源(數據庫)。你可以在同一環境中同時連接不同的數據庫
- 語句(Statement). ODBC使用SQL作為自己的語言。 因而只要簡單的認為語句就是你希望ODBC執行的SQL命令就行了。
以下是使用ODBC編程的一般步驟:
- 連接數據源
- 創建並執行一條或多條SQL語句
- 檢查結果記錄(如果有的話)
- 斷開數據源
在接下來的教程中我們來學習如何來實現這幾步。