ODBC實際上是一個數據庫訪問函數庫,使應用程序可以直接操縱數據庫中的數據。ODBC是基於SQL語言的,是一種在SQL和應用界面之間的標准接口,他解決了嵌入式SQL接口非規范核心,免除了應用軟件隨數據庫的改變而改變的麻煩。ODBC的一個顯著優點是,用它生成的程序是與數據庫或數據庫引擎無關的,為數據庫用戶和開發人員屏蔽了異構環境的復雜性,提供了數據庫訪問的統一接口,為應用程序實現與平台的無關性和可移植性提供了基礎,因而ODBC獲得了廣泛的支持和應用。
ODBC的結構如下圖所示,他又四個主要成分構成:應用程序、驅動程序管理器、驅動程序、數據源。
1.應用程序(Application)
應用程序執行處理並調用ODBC函數,其主要任務如下:
連接數據庫
提交SQL語句給數據庫
檢索結果並處理錯誤
提交或者回滾SQL語句的事務
與數據庫斷開連接
2.驅動程序管理器(Driver Manager)
每種數據庫引擎都需要向ODBC驅動程序管理器注冊他自己的ODBC驅動程序,這種驅動程序對於不同的數據庫引擎是不同的。ODBC驅動程序管理器能將與ODBC兼容的SQL請求從應用程序傳給驅動程序,隨后由驅動程序把對數據庫的操作翻譯成相應數據庫引擎所提供的固有調用,對數據庫實現訪問操作。
3.驅動程序
ODBC通過驅動程序來提供數據庫獨立性。驅動程序是一個用於支持ODBC函數調用的模塊,應用程序調用驅動程序所支持的函數來操縱數據庫。若想使應用程序操作不同類型的數據庫,就要動態連接到不同的驅動程序上。ODBC驅動程序處理ODBC函數調用,將應用程序的SQL請求提交給指定的數據源,接受由數據源返回的結果,傳回給應用程序。
4.數據源
數據源是用戶、應用程序要訪問的數據文件或數據庫,以及訪問他們需要的有關信息。它定義了數據庫服務器的名稱、登錄名和密碼等選項。
5.ODBC數據源的配置
---------------------
2. 常用接口:
- 連接到數據源
下面的函數用於連接到數據源:
(1)SQLAllocHandle:分配環境、連接、語句或者描述符句柄。
(2)SQLConnect:建立與驅動程序或者數據源的連接。訪問數據源的連接句柄包含了包括狀態、事務申明和錯誤信息的所有連接信息。
(3)SQLDriverConnect:與SQLConnect相似,用來連接到驅動程序或者數據源。但它比SQLConnect支持數據源更多的連接信息;
(4)SQLBrowseConnect:支持一種交互方法來檢索或者列出連接數據源所需要的屬性和屬性值。
- 獲取驅動程序和數據源信息
下面的函數用來獲取驅動程序和數據源信息:
(1)SQLDataSources:能夠被調用多次來獲取應用程序使用的所有數據源的名字。
(2)SQLDrivers:返回所有安裝過的驅動程序清單,包括對它們的描述以及屬性關鍵字。
(3)SQLGetInfo:返回連接的驅動程序和數據源的元信息。
(4)SQLGetFunctions:返回指定的驅動程序是否支持某個特定函數的信息。
(5)SQLGetTypeInfo:返回指定的數據源支持的數據類型的信息。
- 設置或者獲取驅動程序屬性
下面的函數用來設置或者獲取驅動程序屬性:
(1)SQLSetConnectAttr:設置連接屬性值。
(2)SQLGetConnectAttr:返回連接屬性值。
(3)SQLSetEnvAttr:設置環境屬性值。
(4)SQLGetEnvAttr:返回環境屬性值。
(5)SQLSetStmtAttr:設置語句屬性值。
(6)SQLGetStmtAttr:返回語句屬性值。
- 設置或者獲取描述符字段
下面的函數用來設置或者獲取描述符字段:
(1)SQLGetDescField:返回單個描述符字段的值。
(2)SQLGetDescRec:返回當前描述符記錄的多個字段的值。
(3)SQLSetDescField:設置單個描述符字段的值。
(4)SQLSetDescRec:設置描述符記錄的多個字段。
- 准備SQL語句
下面的函數用來准備SQL語句:
(1)SQLPrepare:准備要執行的SQL語句。
(2)SQLBindParameter:在SQL語句中分配參數的緩沖區。
(3)SQLGetCursorName:返回與語句句柄相關的游標名稱。
(4)SQLSetCursorName:設置與語句句柄相關的游標名稱。
(5)SQLSetScrollOptions:設置控制游標行為的選項,在ODBC 3.0 中被SQLGetInfo和SQLSetStmtAttr接口替代
- 提交SQL請求
下面的函數用來提交SQL請求:
(1)SQLExecute:與SQLPrepare共同使用,執行准備好的SQL語句。
(2)SQLExecDirect:執行一條SQL語句。
(3)SQLNativeSql:返回驅動程序對一條SQL語句的翻譯,並不執行sql語句。
(4)SQLDescribeParam:返回對SQL語句中指定參數的描述。
(5)SQLNumParams:返回SQL語句中參數的個數。
(6)SQLParamData:與SQLPutData聯合使用在運行時給參數賦值。
(7)SQLPutData:在SQL語句運行時給部分或者全部參數賦值。
- 檢索結果集及其相關信息
下面的函數用來檢索結果集及其相關信息:
(1)SQLRowCount:返回INSERT、UPDATE或者DELETE等語句影響的行數。
(2)SQLNumResultCols:返回結果集中列的數目。
(3)SQLDescribeCol:返回結果集中列的描述符記錄。
(4)SQLColAttribute:返回結果集中列的屬性。
(5)SQLBindCol:為結果集中的列分配緩沖區。
(6)SQLFetch:在結果集中檢索下一行元組。
(7)SQLFetchScroll:返回指定的結果行。
(8)SQLGetData:返回結果集中當前行某一列的值。
(9)SQLSetPos:在取到的數據集中設置游標的位置。這個記錄集中的數據能夠刷新、更新或者刪除。
(10)SQLBulkOperations:執行塊插入和塊書簽操作,其中包括根據書簽更新、刪除或者取數據。
(11)SQLMoreResults:確定是否能夠獲得更多的結果集,如果能就執行下一個結果集的初始化操作。
(12)SQLGetDiagField:返回一個字段值或者一個診斷數據記錄。
(13)SQLGetDiagRec:返回多個字段值或者一個診斷數據記錄。
- 取得數據源系統表的信息
下面的函數用來取得數據源系統表的信息:
(1)SQLColumnPrivileges:返回一個關於指定表的列的列表以及相關的權限信息。
(2)SQLColumns:返回指定表的列信息的列表。
(3)SQLForeignKeys:返回指定表的外鍵信息的列表。
(4)SQLPrimaryKeys:返回指定表的主鍵信息的列表。
(5)SQLProcedureColumns:返回指定存儲過程的參數信息的列表。
(6)SQLProcedures:返回指定數據源的存儲過程信息的列表。
(7)SQLSpecialColumns:返回唯一確定某一行的列的信息,或者當某一事務修改一行的時候自動更新各列的信息。
(8)SQLStatistics:返回一個單表的相關統計信息和索引信息。
(9)SQLTablePrivileges:返回相關各表的名稱以及相關的權限信息。
(10)SQLTables:返回指定數據源中表信息。
- 終止語句執行
下面的函數用來終止語句執行:
(1)SQLFreeStmt:終止語句執行,關閉所有相關的游標,放棄沒有提交的結果,選擇釋放與指定語句句柄相關的資源。
(2)SQLCloseCursor:關閉一個打開的游標,放棄沒有提交的結果。
(3)SQLCancel:放棄執行一條SQL語句。
(4)SQLEndTran:提交或者回滾事務。
- 中斷連接
下面的函數處理中斷連接的任務:
(1) SQLDisconnect:關閉指定連接。
(2) SQLFreeHandle:釋放環境、連接、語句或者描述符句柄。
在數據庫發展的前幾十年里,數據以各種不同的方式存儲並展現給用戶,比如:層次數據庫、網狀數據庫,這些都是非關系數據庫。
直到1970年,才出現了“關系模型”,借助冗余數據來鏈接不同表中的記錄,關系數據庫中的每張表都包含一項作為每行唯一標識的信息(主鍵)。
關系型數據庫:
Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
非關系型數據庫:
NoSql、Cloudant、MongoDb、redis、HBase
在最初的時候,對數據庫的程序訪問是由本機庫來執行的,例如SQL Server的DBLib、Oracle的OCI。
這種方式的優點就是速度快,但缺點更明顯,開發人員需使用不同的API來訪問不同的數據庫系統。一旦更換數據庫,工作量將會很大。
一.ODBC(Open Database Connectivity)開放數據庫連接
是為解決異構數據庫間的數據共享而產生的,允許應用程序以SQL 為數據存取標准,存取不同DBMS(關系型數據管理系統)管理的數據;
使應用程序直接操縱DB中的數據,免除隨DB的改變而改變。用ODBC 可以訪問各類計算機上的DB文件,甚至訪問如Excel 表和ASCI I數據文件這類非數據庫對象。
它建立了一組規范,並提供了一組對數據庫訪問的標准API(應用程序編程接口)。這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支持,用戶可以直接將SQL語句送給ODBC。
總而言之,ODBC提供了一個公共數據訪問層,可用來訪問幾乎所有的RDBMS。
優點:一個基於ODBC的應用程序對數據庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數據庫操作由對應的DBMS的ODBC驅動程序完成。也就是說,不論是FoxPro、Access還是Oracle數據庫,均可用ODBCAPI進行訪問。由此可見,ODBC的最大優點是能以統一的方式處理所有的數據庫。
二.DAO(Data Access Object)數據訪問對象
它顯露了 Microsoft Jet 數據庫引擎(由 Microsoft Access 所使用),並允許 Visual Basic 開發者通過 ODBC 像直接連接到其他數據庫一樣,直接連接到 Access 表。
所以如果數據庫是Access數據庫且是本地使用的話,建議使用這種訪問方式。
三.RDO(Remote Data Objects)遠程數據對象
讓寫Windows應用程序的程序師能夠進入微軟和其他的數據庫供給者的數據庫。
然后,程序中RDO 陳述使用微軟的底層數據存取對象 (DAO) 來實際進入數據庫。 數據庫供給者寫入DAO接口。
是一個到 ODBC 的、面向對象的數據訪問接口,它同易於使用的 DAO style組合在一起,提供了一個接口,形式上展示出所有 ODBC 的底層功能和靈活性。盡管 RDO 在很好地訪問 Jet 或 ISAM 數據庫方面受到限制,而且它只能通過現存的 ODBC 驅動程序來訪問關系數據庫。但是,RDO 已被證明是許多 SQL Server、Oracle 以及其他大型關系數據庫開發者經常選用的最佳接口。RDO 提供了用來訪問存儲過程和復雜結果集的更多和更復雜的對象、屬性,以及方法。
四.OLE DB(Object Linking and Embedding, Database)對象連接嵌入數據庫
是微軟的戰略性的通向不同的數據源的低級應用程序接口,OLE DB不僅包括微軟資助的標准數據接口ODBC的結構化查詢語言(SQL)能力,還具有面向其他非SQL數據類型的通路。
OLE DB 是建立在 ODBC 功能之上的一個開放規范,ODBC 是為訪問關系型數據庫而專門開發的,OLE DB 則用於訪問關系型和非關系型信息源。
五.ADO(ActiveX Data Object)活動數據對象
ADO是DAO/RDO的后繼產物。ADO 2.0在功能上與RDO更相似,而且一般來說,在這兩種模型之間有一種相似的映射關系。ADO"擴展"了DAO和 RDO 所使用的對象模型,這意味着它包含較少的對象、更多的屬性、方法(和參數),以及事件。 作為最新的數據庫訪問模式,ADO的使用也是簡單易用,所以微軟已經明確表示今后把重點放在ADO上,對DAO/RDO不再作升級,所以ADO已經成為了當前數據庫開發的主流。 ADO涉及的數據存儲有DSN(數據源名稱)、ODBC(開放式數據連接)以及OLE DB三種方式。后面的例程將詳細講解這三種方式的具體訪問實現。---可以說是對odbc,oledb這些系統級的編程接口的匯接,並對DAO,RDO這些應用級的編程接口的升級吧。
ODBC 、DAO 、ADO 、OLEDB 數據庫連接方式區別及聯系
ODBC 是一種底層的訪問技術,因此,ODBC API 可以是客戶應用程序能從底層設置和控制數據庫,完成一些高級數據庫技術無法完成的功能;但不足之處由於ODBC只能用於關系型數據庫,使得利用ODBC很難訪問對象數據庫及其他非關系數據庫。
DAO 提供了一種通過程序代碼創建和操縱數據庫的機制。最大特點是對MICROSOFT JET數據庫的操作很方便,而且是操作JET數據庫時性能最好的技術接口之一。並且它並不只能用於訪問這種數據庫,事實上,通過DAO技術可以訪問從文本文件到大型后台數據庫等多種數據格式。
ADO是基於OLE DB的訪問接口,它是面向對象的OLE DB技術,繼承了OLE DB的優點。屬於數據庫訪問的高層接口。
名詞解釋:
ODBC(Open DataBase Connectivity)開放數據庫互聯。是由微軟主導的數據庫鏈接標准。
MFC(Microsoft Foundation Class)微軟基礎類。MFC ODBC是對ODBC的封裝。
DAO(Data Access Object)數據訪問對象。不提供遠程訪問功能。
RDO(Remote Data Object)遠程數據對象。速度快,支持SQL Server存儲過程,同DAO一樣是發展很多年了的技術。
OLE-DB(Object Linking and Embedding DataBase)對象鏈接和嵌入數據庫。它依賴於COM和提供OLE DB提供者的廠商而非ODBC使用的SQL。
ADO(ActiveX Data Object)ActiveX數據對象。基於OLE-DB建立連接的局部和遠程數據庫訪問技術。同OLE-DB一樣要“年輕”些。
使用中,我們一般用OLE-DB和ADO替代DAO和RDO。
ADO和OLEDB之間的關系
OLEDB是一種底層數據訪問界面接口。是用於第三方驅動程序商家開發輸出數據源到ADO-技術的應用程序或用於C++的開發者開發定制的數據庫組件。
OLE DB 是用於訪問數據的重要的系統級編程接口,它是 ADO 的基礎技術,同時還是 ADO.NET 的數據源。
ADO 是基於OLE DB的訪問接口,它是面向對象的OLE DB技術,繼承了OLE DB的優點。屬於數據庫訪問的高層接口。
可以這么說,ADO為OLEDB提供高層應用API函數。
各種數據接口的連接方式
一、ADO連接
1、連接access數據庫
set conn=Server.CreateObject("ADODB.Connection")
conn.open "Driver={Microsoft Access Driver (*.mdb)};dbq="&Server.Mappath("dbname(路徑全名)")
2、連接SQL Server數據庫
set conn=server.CreateObject("ADODB.Connection")
sql="Driver={SQL Server};server=(local);uid=sa;pwd=sa;database=dbname"
conn.open(sql)
二、ODBC連接(必須先注冊數據源---DSN)
(列舉配置SQL Server數據庫文件DSN,打開管理工具---數據源(ODBC)---打開系統DSN選項卡---單擊添加按鈕---從列表中選擇SQL Server,單擊完成---在名稱中輸入數據庫名稱,在你想連接的SQL Server服務器中輸入(local)---按向導提示完成)
1、連接access數據庫
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DSN=注冊名"
2、連接SQL Server數據庫
set conn=Server.CreateObject("ADODB.Connection")
conn.connectionstring="DSN=注冊名;UID=sa;PWD=sa;"
conn.open
三、OLEDB連接數據庫
1、連接access數據庫
set conn=Server.CreateObject("ADODB.Connection")
conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&server.MapPath("dbname(路徑全名)")&";Persist Security Info=False"
set rs=Server.CreateObject("ADODB.Recordset")
2、連接SQL Server數據庫
set conn=server.CreateObject("ADODB.Connection")
sql="Provider=SQLOLEDB;data source=(local);initial catalog=dbname;User ID=sa;password=sa;"
conn.open(sql)
參考:
https://msdn.microsoft.com/en-us/library/ms714562(v=vs.85).aspx
http://www.cnblogs.com/huzhongzhong/archive/2011/07/12/2104209.html
https://blog.csdn.net/df_xiao/article/details/40511149
關於更詳細的ODBC API的信息,可以參考MSDN ODBC Reference。可以在http://msdn.microsoft.com/en-us/library/ms713607(v=vs.85).aspx獲得相關文檔。
另外編寫本文還參考了以下兩個文檔:
http://msdn.microsoft.com/zh-cn/library/1dwe8111.aspx
http://www.cnblogs.com/kzloser/archive/2012/11/29/2794815.html