在上一篇文章《你必須知道的ADO.NET(一) 初識ADO.NET》中,我們知道ADO.NET的兩大核心組件分別是Data Provider和DataSet。如果說DataSet是ADO.NET的心臟,那么Data Provider絕對是ADO.NET的左臂右膀。Data Provider提供了訪問外部數(shù)據(jù)數(shù)據(jù)源的可能性,而且外部的數(shù)據(jù)源是多樣的。本文將詳細說明.NET數(shù)據(jù)提供程序的作用以及如何訪問不同的數(shù)據(jù)源。
.NET Framework數(shù)據(jù)提供程序用于連接數(shù)據(jù)庫、執(zhí)行命令和檢索結(jié)果。這些結(jié)果將被直接處理,放置在 DataSet 中以便根據(jù)需要向用戶公開、與多個源中的數(shù)據(jù)組合,或在層之間進行遠程處理。.NET Framework 數(shù)據(jù)提供程序是輕量的,它在數(shù)據(jù)源和代碼之間創(chuàng)建最小的分層,并在不降低功能性的情況下提高性能。
下表列出了 .NET Framework 中所包含的數(shù)據(jù)提供程序。
.NET數(shù)據(jù)提供程序 | 說明 |
---|---|
用于 SQL Server 的數(shù)據(jù)提供程序 | 提供對 Microsoft SQL Server 7.0 或更高版本中數(shù)據(jù)的訪問。使用 System.Data.SqlClient 命名空間。 |
用于 OLE DB 的數(shù)據(jù)提供程序 | 提供對使用 OLE DB 公開的數(shù)據(jù)源中數(shù)據(jù)的訪問。使用 System.Data.OleDb 命名空間。 |
用于 ODBC 的數(shù)據(jù)提供程序 | 提供對使用 ODBC 公開的數(shù)據(jù)源中數(shù)據(jù)的訪問。使用 System.Data.Odbc 命名空間。 |
用于 Oracle 的數(shù)據(jù)提供程序 | 適用于 Oracle 數(shù)據(jù)源。用于 Oracle 的 .NET Framework 數(shù)據(jù)提供程序支持 Oracle 客戶端軟件 8.1.7 和更高版本,并使用 System.Data.OracleClient 命名空間。 |
EntityClient 提供程序 | 提供對實體數(shù)據(jù)模型 (EDM) 應(yīng)用程序的數(shù)據(jù)訪問。使用 System.Data.EntityClient 命名空間。 |
在上一篇文章中,我們知道Connection對象、Command對象、DataReader對象以及DataAdapter對象構(gòu)成了.NET數(shù)據(jù)提供程序的骨架。這四個對象非常重要,在后續(xù)的文章中,我將詳細的講解。如果需要了解這些對象的作用,可以參考上一篇文章《你必須知道的ADO.NET(一) 初識ADO.NET》。
如果說上述四大對象構(gòu)成了.NET數(shù)據(jù)提供程序的骨架,那么下面我要說的這些對象可以說是.NET數(shù)據(jù)提供程序的血肉了。這些對象雖然沒有四大核心對象那么的光鮮耀眼,但卻也是“八仙過海,各顯神通”。
說對Parameter對象,也許大部分人會說:“哦,原來是它啊”。盡管大部分人已經(jīng)很熟悉了,我還是要在這里嘮叨幾句。我需要強調(diào)是,這一系列的文章主要寫給對ADO.NET還不熟悉,或者剛?cè)腴T的讀者,旨在講解ADO.NET最最基礎(chǔ)卻又非常重要的內(nèi)容。
簡單的講,Parameter對象定義了命令和存儲過程的輸入、輸出和返回值參數(shù)。哦!看起來,好像并不是那么強大,那么Parameter對象到底有什么本領(lǐng)呢?
先看這樣一段代碼,也許很多人曾經(jīng)都寫過,包括我自己:
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
只要懂一點SQL語法的童鞋都知道,這不就是一個簡單的登陸查詢驗證代碼嗎?好,先別急,你知道的,說不定別人還不知道。
試想一下,如果用戶(一般是那些技術(shù)高超,自稱為“黑客”的高級用戶)填入
userName = "' OR '1'='1";
與
passWord = "' OR '1'='1";
接下來,將見證奇跡的時刻:該用戶竟然成功登陸網(wǎng)站了。哇!看起來這一切似乎多么的魔幻和神奇,其實我們稍作分析發(fā)現(xiàn)這也不過是一些雕蟲小計。
我們將userName和passWord變量帶入strSQL變量后,將得到這樣的一條SQL語句:
strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = '' OR '1'='1');"
也就是實際上運行的SQL命令會變成下面這樣的
strSQL = "SELECT * FROM users;"
到這一步,我想也不需要我多說了吧,你懂的!上面的情況,用專業(yè)術(shù)語來說就是一個簡單的SQL注入(SQL injection)。記得上政治課的時候,我印象最深的一句話是,“萬物都是矛盾統(tǒng)一的”。這句話經(jīng)典而又真實,以至于時刻在我的腦海里浮現(xiàn)。有SQL注入的出現(xiàn),因此就有參數(shù)化查詢(Parameterized Query )的出現(xiàn)。
參數(shù)化查詢是指在設(shè)計與數(shù)據(jù)庫連結(jié)并存取資料時,在需要填入數(shù)值或資料的地方,使用參數(shù) (Parameter) 來給值,這個方法目前已被視為最有效可預(yù)防SQL注入(SQL Injection) 的攻擊手法的防御方式。在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫完成 SQL 指令的編譯后,才套用參數(shù)執(zhí)行,因此就算參數(shù)中含有具破壞性的指令,也不會被數(shù)據(jù)庫所執(zhí)行。說了這么多,無非是想說明Parameter對象的重要性。黃婆賣瓜,也得自賣自夸一下吧!Parameter對象有兩個非常重要的屬性:DBType和Value。DBType用來設(shè)置或獲取參數(shù)的類型,Value則用來設(shè)置或獲取參數(shù)的值。
好了,現(xiàn)在我們用Parameter對象來改寫簡單的登陸驗證代碼:
1 strSQL = "SELECT * FROM users WHERE Name = @Name and Password = @Password";
2 SqlParamter[] paras = new SqlParamter[]{//參數(shù)數(shù)組
3 new SqlParamter("@Name",SqlDBType.Varchar,50)
4 new SqlParamter("@Password",SqlDBType.Varchar,50)};
5 paras[0].value = userName;//綁定用戶名
6 paras[1].value = password;//綁定用戶密碼
用于 SQL Server 的 .NET Framework 數(shù)據(jù)提供程序 (SqlClient) 使用自己的協(xié)議與 SQL Server 進行通信。 它是輕量的且性能良好,因為它進行了優(yōu)化,可直接訪問 SQL Server,而無需添加 OLE DB 或開放式數(shù)據(jù)庫連接 (ODBC) 層。 下圖4.1.1將用于 SQL Server 的 .NET Framework 數(shù)據(jù)提供程序與用于 OLE DB 的 .NET Framework 數(shù)據(jù)提供程序進行對比。 用于 OLE DB 的 .NET Framework 數(shù)據(jù)提供程序通過 OLE DB 服務(wù)組件(它提供連接池和事務(wù)服務(wù))和用于數(shù)據(jù)源的 OLE DB 訪問接口與 OLE DB 數(shù)據(jù)源進行通信。
圖4.1.1 SQL Server 與 OLE DB .NET Framework 數(shù)據(jù)提供程序進行對比
若要使用用于 SQL Server 的 .NET Framework 數(shù)據(jù)提供程序,您必須具有對 SQL Server 7.0 或更高版本的訪問權(quán)限。 用于 SQL Server 類的 .NET Framework 數(shù)據(jù)提供程序位于 System.Data.SqlClient 命名空間中。 對于早期版本的 SQL Server,請將用于 OLE DB 的 .NET Framework 數(shù)據(jù)提供程序與 SQL Server OLE DB 訪問接口 System.Data.OleDb 一起使用。
用于 SQL Server 的 .NET Framework 數(shù)據(jù)提供程序支持本地事務(wù)和分布式事務(wù)。 對于分布式事務(wù),默認情況下,用于 SQL Server 的 .NET Framework 數(shù)據(jù)提供程序會自動登記在事務(wù)中,并自動從 Windows 組件服務(wù)或 System.Transactions 獲取事務(wù)詳細信息。
如果你使用SQL Server數(shù)據(jù)提供程序需要引入:
using System.Data.SqlClient;
如果你使用OLE DB數(shù)據(jù)提供程序需要引入:
using System.Data.OleDb;
用于 ODBC 的 .NET Framework 數(shù)據(jù)提供程序 (Odbc) 使用本機 ODBC 驅(qū)動程序管理器 (DM) 來啟用數(shù)據(jù)訪問。 ODBC 數(shù)據(jù)提供程序支持本地事務(wù)和分布式事務(wù)兩者。 對于分布式事務(wù),默認情況下,ODBC 數(shù)據(jù)提供程序會自動登記在事務(wù)中,并自動從 Windows 2000 組件服務(wù)獲取事務(wù)詳細信息。用于 ODBC 類的 .NET Framework 數(shù)據(jù)提供程序位于 System.Data.Odbc 命名空間中。
如果你使用ODBC數(shù)據(jù)提供程序需要引入:
using System.Data.Odbc;
用于 Oracle 的 .NET Framework 數(shù)據(jù)提供程序 (OracleClient) 通過 Oracle 客戶端連接軟件啟用對 Oracle 數(shù)據(jù)源的數(shù)據(jù)訪問。 該數(shù)據(jù)提供程序支持 Oracle 客戶端軟件 8.1.7 版或更高版本。 該數(shù)據(jù)提供程序支持本地事務(wù)和分布式事務(wù)兩者。
用于 Oracle 的 .NET Framework 數(shù)據(jù)提供程序要求系統(tǒng)上安裝有 Oracle 客戶端軟件(8.1.7 版或更高版本),才能連接到 Oracle 數(shù)據(jù)源。
用于 Oracle 類的 .NET Framework 數(shù)據(jù)提供程序位于 System.Data.OracleClient 命名空間中,并包含在 System.Data.OracleClient.dll 程序集中。 當(dāng)編譯使用該數(shù)據(jù)提供程序的應(yīng)用程序時,必須同時引用 System.Data.dll 和 System.Data.OracleClient.dll。
如果你使用Oracle數(shù)據(jù)提供程序需要引入:
1 using System.Data;
2 using System.Data.OracleClient;
應(yīng)用程序或者數(shù)據(jù)源不同,我們就需要選擇不同的.NET數(shù)據(jù)提供程序。在此,微軟官方已經(jīng)給了我們很好的建議,如下表:
提供程序 | 說明 |
---|---|
用于 SQL Server 的數(shù)據(jù)提供程序 | 建議用于使用 Microsoft SQL Server 7.0 或更高版本的中間層應(yīng)用程序。 建議用于使用 Microsoft 數(shù)據(jù)庫引擎 (MSDE) 或 SQL Server 7.0 或更高版本的單層應(yīng)用程序。 建議將用于 SQL Server 的 OLE DB 訪問接口 (SQLOLEDB) 與用于 OLE DB 的 .NET Framework 數(shù)據(jù)提供程序一起使用。 對于 SQL Server 6.5 和更新版本,您必須將用于 SQL Server 的 OLE DB 訪問接口與用于 OLE DB 的 .NET Framework 數(shù)據(jù)提供程序一起使用。 |
用于 OLE DB 的數(shù)據(jù)提供程序 | 建議用于使用 SQL Server 6.5 或早期版本的中間層應(yīng)用程序。 對于 SQL Server 7.0 或更高版本,建議使用用于 SQL Server 的 .NET Framework 數(shù)據(jù)提供程序。 還建議用于使用 Microsoft Access 數(shù)據(jù)庫的單層應(yīng)用程序。 不建議將 Access 數(shù)據(jù)庫用于中間層應(yīng)用程序。 |
用于 ODBC 的數(shù)據(jù)提供程序 | 建議用于使用 ODBC 數(shù)據(jù)源的中間層應(yīng)用程序和單層應(yīng)用程序。 |
用于 Oracle 的數(shù)據(jù)提供程序 | 建議用于使用 Oracle 數(shù)據(jù)源的中間層應(yīng)用程序和單層應(yīng)用程序。 |
聯(lián)系客服