資料存取
資料存取 (Data Access),是應用程式連結到資料來源 (Data Source) 存取資料的一種行為 (Behavior),在大多數的應用程式中,經常會需要使用到資料,而這些資料可能來自很多不同類型的來源,像是資料庫 (Database),網路資料來源,本機檔案,或是異質性的來源 (例如在 Mainframe 上的 IBM DB2 資料庫),經由一層 (或多層) 中介程式碼或中介軟體 (Middleware) 進入資料來源中,並且取出資料後送回應用程式中來處理。
標準
資料存取通常會依資料來源的不同,而會出現不同的存取方法,例如早期 SQL Server 的 DB-Library,這些介面通常只能由 C/C++ 程式語言來呼叫,而且各個資料庫都有各自獨立的 API。但開發工具與軟體廠商開始相繼的提供一致的介面標準,由資料庫廠商開發出基於介面標準的 API,以方便應用程式開發人員發展資料庫應用程式 (Database Application)。
ODBC
ODBC (Open Database Connectivity) 是由 SQL Access Group,X/Open (目前為 The Open Group 的一部份) 以及 ISO/EIC 所提出的 Call Level Interface (CLI) (呼叫層次介面) 介面規格[1],由微軟開發出第一份 ODBC 的實作,每一個資料庫都可以實作出連結自家資料來源的 ODBC 驅動程式 (Driver),而應用程式開發人員能夠利用 ODBC 所開放的 API 呼叫,經由 ODBC Driver 來進入資料庫進行存取以及處理工作。
ODBC 現在已經是大多數平台上的共同資料存取標準,並且後續由各軟體廠商提出的資料存取規格,多數都和 ODBC 有類似的規格。
JDBC
與 ODBC 類似,由昇陽在 JDK 1.1 中建立的專屬 Java 程式語言的資料存取規範[2],各家資料庫可以實作 JDBC Driver 介面提供資料來源的功能,而應用程式開發人員可利用 Java 所提供的 JDBC API (java.sql 與 javax.sql 封裝) 來呼叫 JDBC 類別物件,再由 JDBC 類別物件來呼叫 JDBC Driver 連到資料庫中。
目前最新版本為 JDBC 4.0 (於 Java SE 6.0 中)
OLE DB
由Microsoft提出的類似 ODBC 的資料庫存取規格,但它是使用 COM 以及 Provider-Based 模型來建構,OLE DB 規格[3]中定義了許多的介面,由資料庫提供者 (database provider) 來實作這些介面,應用程式開發人員則直接利用 COM 呼叫這些 OLE DB 介面來連接與存取資料。但 Microsoft 也實作了可以橋接 ODBC Driver 的提供者:OLE DB Provider for ODBC,在微軟 Windows 應用平台中被大量使用於資料存取中。與 JDBC 不同的是 JDBC 是屬於 Java 程式語言的專屬規格,但 OLE DB 可以被能夠呼叫 COM 介面的任何程式語言使用。
OLE DB 也是 ADO 以及 ADO.NET 的核心基礎,而這些 API 目前也被廣為用在微軟 Windows 應用平台中。
原理
大多數資料存取的介面規格都是由連線 (Connection),命令 (Command),以及資料集 (Resultset)三個部份構成。
連線
連線是由應用程式透過呼叫資料存取提供介面提供的函式,以連線的必要資訊為主,與資料庫之間所建立的一條實體資料連結,連結的方式要視資料庫以及資料庫所在位置而定,這些連線所需要的必要資訊,通常都會定義在一組字串中,此字串即稱為連線字串 (Connection String)[4],連線字串在 JDBC 與 OLE DB 的應用程式中隨處可見。
一個典型的連線字串如下:
OLE DB for ODBC:
Driver={mySQL};Server=myServerAddress;Option=131072;Stmt=;Database=myDataBase; User=myUsername;Password=myPassword;
OLE DB for SQL Native Client:
Provider=SQLNCLI;Server=myServerName\theInstanceName;Database=myDataBase;Trusted_Connection=yes;
當連線開啟到關閉之間,應用程式可以利用命令來呼叫或存取資料來源中的資料,但不同的應用程式類型,控制資料庫連線生命期的方式也不同,例如在網站類型的應用程式 (Web Application) 中,為了不讓資料庫的資源在多人環境下被鎖定太久,因此連線通常只會在實際執行資料存取前才會打開,在存取完成後立刻關閉。
命令
命令是由應用程式經由連線送入資料來源的指令或資料,通常是 SQL 指令(或預存程序)以及其參數,或者是由資料來源所支援的其他控制碼等,命令送入資料庫執行後,視命令類型來決定會不會傳回資料集,像是 SQL 的 SELECT 指令會傳回結果集,而 INSERT, UPDATE, DELETE 會回傳受影響的列數 (可以由資料庫控制不傳回)。
資料集
資料集是由命令送入資料來源後所傳回,帶有結果資料錄的集合,資料集可視為一個小型的資料表格,資料存取介面也提供資料集瀏覽的 API 來讓應用程式存取並使用資料集中的資料,大多數資料集的瀏覽介面都是由高階的 API 來提供,例如 ADO 是由 Recordset 來封裝,JDBC 由 Resultset 來封裝,而 ADO.NET 則是用 DataReader 來封裝。
部份資料集介面也提供在不與資料庫連線下存取的暫存資料集服務,例如 ADO.NET 中的 DataTable,DataSet 等。