最大的網站源碼資源下載站,
ado.net 引入的主要變化之一是用 datatable、dataset、dataadapter 和 datareader 對象的組合取代了 ado recordset 對象。datatable 表示單個表中行的集合,在這一方面類似于 recordset。dataset 表示 datatable 對象的集合,同時包括將各種表綁定在一起的關系和約束。實際上,dataset 是帶有內置 xml 支持的、內存中的關系結構。
dataset 的主要特性之一是它不了解可能用來填充它的基礎數據源。它是一個不連續的、獨立的實體,用于表示數據集合,并且可以通過多層應用程序的不同層在組件之間傳遞。它還可以作為 xml 數據流進行序列化,這使其非常適合于在不同種類的平臺之間進行數據傳輸。ado.net 使用 dataadapter 對象將數據傳送到 dataset 和基礎數據源,或者從數據源傳出。dataadapter 對象還提供以前與 recordset 關聯的增強的批量更新功能。
ado.net 依賴于 .net 數據提供程序的服務。這些提供程序提供對基礎數據源的訪問,并且包括四個主要對象(connection、command、datareader 和 dataadapter)。
目前,ado.net 隨附了兩類提供程序:bridge 提供程序和 native 提供程序。通過 bridge 提供程序(如那些為 ole db 和 odbc 提供的提供程序),可以使用為以前的數據訪問技術設計的數據庫。native 提供程序(如 sql server 和 oracle 提供程序)通常能夠提供性能方面的改善,部分原因在于少了一個抽象層。
與各個 .net 數據提供程序相關聯的類型(類、結構、枚舉等)位于其各自的命名空間中:
| • | system.data.sqlclient。包含 sql server .net 數據提供程序類型。 |
| • | system.data.oracleclient。包含 oracle .net 數據提供程序。 |
| • | system.data.oledb。包含 ole db .net 數據提供程序類型。 |
| • | system.data.odbc。包含 odbc .net 數據提供程序類型。 |
| • | system.data。包含獨立于提供程序的類型,如 dataset 和 datatable。 |
在各自的關聯命名空間內,每個提供程序都提供了對 connection、command、datareader 和 dataadapter 對象的實現。sqlclient 實現的前綴為“sql”,而 oledb 實現的前綴為“oledb”。例如,connection 對象的 sqlclient 實現是 sqlconnection,而 oledb 實現則為 oledbconnection。同樣,dataadapter 對象的兩個實現分別為 sqldataadapter 和 oledbdataadapter。
本文檔中顯示的大多數代碼片段使用 sqlcommand 對象來調用存儲過程,以執行數據庫操作。在某些情況下,您將不會看到 sqlcommand 對象,因為存儲過程名被直接傳遞給 sqldataadapter 對象。在內部,這仍然會導致創建 sqlcommand 對象。
您應該使用存儲過程而不是嵌入的 sql 語句,原因如下:
| • | 存儲過程通常可以改善性能,因為數據庫能夠優化存儲過程使用的數據訪問計劃,并且能夠緩存該計劃以供將來重用。 |
| • | 可以在數據庫內分別設置各個存儲過程的安全保護。客戶端不必對基礎表擁有訪問權限,就可以獲得執行存儲過程的權限。 |
| • | 存儲過程可以簡化維護工作,因為修改存儲過程通常要比更改已部署組件中的硬編碼 sql 語句容易。 |
| • | 存儲過程為基礎數據庫架構增加了額外的抽象級別。存儲過程的客戶端與存儲過程的實現細節是彼此隔離的,與基礎架構也是彼此隔離的。 |
| • | 存儲過程可以減少網絡流量,因為可以批量執行 sql 語句,而不是從客戶端發送多個請求。 |
sql server 聯機文檔強烈建議您不要使用“sp_”作為名稱前綴來創建任何存儲過程,因為此類名稱已經被指定給系統存儲過程。sql server 始終按以下順序來查找以 sp_ 開頭的存儲過程:
1. | 在主數據庫中查找存儲過程。 |
2. | 基于所提供的任何限定符(數據庫名或所有者)來查找存儲過程。 |
3. | 使用 dbo 作為所有者來查找存儲過程(如果未指定所有者)。 |
可以通過構造函數參數來設置 ado.net 對象的特定屬性值,也可以直接設置屬性值。例如,下面的代碼片段在功能上是等效的。
// use constructor arguments to configure command objectsqlcommand cmd = new sqlcommand( "select * from products", conn );// the above line is functionally equivalent to the following// three lines which set properties explicitlysqlcommand cmd = new sqlcommand();cmd.connection = conn;cmd.commandtext = "select * from products";
從性能角度看,這兩種方法之間的差異是微不足道的,因為針對 .net 對象設置和獲取屬性要比針對 com 對象執行類似操作更為高效。
選擇哪種方法取決于個人喜好和編碼風格。不過,對屬性進行明確設置確實能夠使代碼更易理解(尤其是當您不熟悉 ado.net 對象模型時)和調試。
數據庫連接代表一種關鍵的、昂貴的和有限的資源,尤其是在多層 web 應用程序中。正確地管理連接是十分必要的,因為您采取的方法可能顯著影響應用程序的總體可伸縮性。同時,還要認真考慮在何處存儲連接字符串。需要使用可配置的且安全的位置。
在管理數據庫連接和連接字符串時,應該努力做到:
| • | 通過在多個客戶端中多路復用數據庫連接池,幫助實現應用程序的可伸縮性。 |
| • | 采用可配置的、高性能的連接池策略。 |
| • | 在訪問 sql?server 時使用 windows 身份驗證。 |
| • | 在中間層避免模擬。 |
| • | 安全地存儲連接字符串。 |
| • | 盡量晚地打開數據庫連接,盡量早地將其關閉。 |
本節討論連接池,并且幫助您選擇適當的連接池策略。本節還將考慮應該如何管理、存儲和操縱數據庫連接字符串。最后,本節將給出兩種編碼模式,可用來幫助確保連接被可靠地關閉,并被返回到連接池。
如果您使用的是 sql server .net 數據提供程序,請使用該提供程序提供的連接池支持。這是一種由該提供程序在內部實現的支持事務處理并且非常高效的機制,它存在于托管代碼中。池是以每個應用程序的域為基礎創建的,并且在應用程序域卸載之前不會銷毀。
可以透明地使用這種形式的連接池,但應該知道池的管理方式以及可用來微調連接池的各種配置選項。
在許多情況下,對于您的應用程序而言,sql server .net 數據提供程序的默認連接池設置可能已經足夠了。在開發和測試基于 .net 的應用程序的過程中,建議您對規劃通信模式進行模擬,以確定是否需要修改連接池大小。
需要生成可伸縮的高性能應用程序的開發人員應該最大限度地減少使用連接的時間,只在檢索或更新數據時才使連接保持打開狀態。連接關閉時,將被返回到連接池,并可供重用。在此情況下,到數據庫的實際連接不會被切斷;不過,如果連接池被禁用,則到數據庫的實際連接將被關閉。
開發人員應該十分小心,不要依賴垃圾回收器來釋放連接,因為當引用離開作用范圍時,連接未必能夠關閉。這是連接泄漏的一種常見根源,當請求新連接時,這會導致連接異常。
可以使用一組名稱-值對(通過連接字符串提供)來配置連接池。例如,可以配置是否啟用連接池(默認情況下啟用)、池的最大容量和最小容量,以及要打開連接的排隊請求可以阻塞的時間長度。下面是一個示例連接字符串,用于配置池的最大容量和最小容量。
"server=(local); integrated security=sspi; database=northwind; max pool size=75; min pool size=5"
打開連接并創建池以后,會將多個連接添加到池中,以便將連接數量提高到所配置的最小數量。隨后,可以繼續向該池中添加連接,直至達到所配置的最大池數量。當達到最大數量時,要打開連接的新請求將排隊等待一段可配置的時間。
當使用 sql server .net 數據提供程序連接池時,請注意以下幾個方面:
| • | 連接是通過連接字符串上的完全匹配算法進行池化的。池機制甚至對名稱-值對之間的空格也敏感。例如,下面的兩個連接字符串將導致兩個獨立的池,因為第二個連接字符串包含額外的空格字符。 sqlconnection conn = new sqlconnection( "integrated security=sspi;database=northwind");conn.open(); // pool a is createdsqlconmection conn = new sqlconnection( "integrated security=sspi ; database=northwind");conn.open(); // pool b is created (extra spaces in string) |
| • | 連接池被劃分為多個事務專有池和一個與當前尚未在事務中登記的連接對應的池。對于與特定事務上下文關聯的線程,會返回相應池(該池包含在該事務中登記的連接)的連接。這就使得使用已登記的連接成為一個透明的過程。 |
ole db .net 數據提供程序通過使用基礎 ole db 資源池來池化連接。有多個用于配置資源池的選擇:
| • | 可以使用連接字符串來配置、啟用或禁用資源池。 |
| • | 可以使用注冊表。 |
| • | 可以用編程方式配置資源池。 |
為避免出現與注冊表相關的部署問題,請不要使用注冊表來配置 ole db 資源池。
要對應用程序使用連接池的情況進行監控,可以使用 sql server 隨附的事件探查器工具,或者使用 microsoft windows? 2000 操作系統隨附的性能監視器工具。
1. | 單擊 start,指向 programs,指向 microsoftsqlserver,然后單擊 profiler 以啟動事件探查器。 |
2. | 在 file 菜單上,指向 new,然后單擊 trace。 |
3. | 提供連接詳細信息,然后單擊 ok。 |
4. | 在 trace properties 對話框中,單擊 events 選項卡。 |
5. | 在 selected event classes 列表中,確保 audit login 和 audit logout 事件顯示在 security audit 下面。要使跟蹤變得更為清晰,請從該列表中刪除所有其他事件。 |
6. | 單擊 run 以啟動跟蹤。當連接建立時,您將看到 audit login 事件;當連接關閉時,您將看到 audit logout 事件。 |
1. | 單擊 start,指向 programs,指向 administrative tools,然后單擊 performance 以啟動性能監視器。 |
2. | 右鍵單擊圖形背景,然后單擊 addcounters。 |
3. | 在 performance object 下拉列表中,單擊 sql server:general statistics。 |
4. | 在顯示的列表中,單擊 user connections。 |
5. | 單擊 add,然后單擊 close。 |
盡管數據庫連接池提高了應用程序的總體可伸縮性,但這意味著您不再能夠在數據庫級別管理安全性。這是因為,要支持連接池,連接字符串必須完全相同。如果您需要跟蹤每個用戶的數據庫操作,請考慮添加一個參數,以便能夠傳遞用戶標識并在數據庫中手動記錄用戶操作。您需要將該參數添加到每個操作中。
在連接到 sql server 時,應該使用 windows 身份驗證,因為它提供了許多好處:
1. | 安全性更易于管理,因為您使用單一 (windows) 安全模型,而不是獨立的 sql server 安全模型。 |
2. | 可避免將用戶名和密碼嵌入到連接字符串中。 |
3. | 不會以明文方式通過網絡傳遞用戶名和密碼。 |
4. | 通過采用密碼到期期限、最小長度以及在多次無效登錄請求后鎖定帳戶,改善了登錄安全性。 |
要存儲數據庫連接字符串,可以有多種選擇,這些選擇具有不同級別的靈活性和安全性。盡管在源代碼中對連接字符串進行硬編碼可提供最佳性能,但文件系統緩存可確保在外部將該字符串存儲到文件系統中所帶來的性能下降是微不足道的。幾乎在所有情況下,人們都首選外部連接字符串所提供的額外的靈活性(它支持管理員配置)。
當您選擇連接字符串存儲方法時,需要注意的兩個最重要的事項是安全性和配置簡易性,然后緊跟著的是性能。
可以選擇下列位置來存儲數據庫連接字符串:
| • | 在應用程序配置文件中;例如,asp.net web 應用程序的 web.config |
| • | 在通用數據鏈接 (udl) 文件中(僅由 ole db .net 數據提供程序支持) |
| • | 在 windows 注冊表中 |
| • | 在自定義文件中 |
| • | 在 com+ 目錄中,方法是使用構建字符串(僅適用于服務組件) |
通過使用 windows 身份驗證來訪問 sql server,可以避免將用戶名和密碼存儲在連接字符串中。如果您的安全要求需要采取更嚴格的措施,請考慮以加密格式存儲連接字符串。
對于 asp.net web 應用程序而言,在 web.config 文件內以加密格式存儲連接字符串,代表著一種安全的、可配置的解決方案。
注 可以在連接字符串中將 persist security info 命名值設置為 false,以禁止通過 sqlconnection 或 oledbconnection 對象的 connectionstring 屬性返回對安全敏感的細節(如密碼)。
下面幾小節討論了如何使用各種選擇來存儲連接字符串,并介紹了各種方法的相對優點和缺點。這些內容有助于您根據自己特定的應用程序方案做出明智的選擇。
可以使用 <appsettings> 元素在應用程序配置文件的自定義設置節中存儲數據庫連接字符串。該元素支持任意的密鑰-值對,如以下代碼片段所示:
<configuration> <appsettings> <add key="dbconnstr" value="server=(local);integrated security=sspi;database=northwind"/> </appsettings></configuration>
注 <appsettings> 元素出現在 <configuration> 元素下面,并且不是緊跟在 <system.web> 的后面。
| • | 易于部署。連接字符串是通過定期 .net xcopy 部署與配置文件一起部署的。 |
| • | 易于以編程方式訪問。通過 configurationsettings 類的 appsettings 屬性,可以在運行時方便地讀取已配置的數據庫連接字符串。 |
| • | 支持動態更新(僅限于 asp.net)。如果管理員在 web.config 文件中更新連接字符串,當下一次訪問該字符串時(對于無狀態組件而言,這可能是客戶端下一次使用該組件進行數據訪問請求),所做更改將生效。 |
| • | 安全性。盡管 asp.net internet 服務器應用程序編程接口 (isapi) 動態鏈接庫 (dll) 禁止客戶端直接訪問帶有 .config 文件擴展名的文件,并且可以使用 ntfs 權限進一步限制訪問,您可能仍然希望避免以明文形式在前端 web 服務器上存儲這些詳細信息。為獲得額外的安全性,請以加密格式在配置文件中存儲連接字符串。 |
可以使用 system.configuration.configurationsettings 類的靜態 appsettings 屬性來檢索自定義應用程序設置。以下代碼片段對此進行了說明,該代碼片段采用了前面例舉的名為 dbconnstr 的自定義密鑰:
using system.configuration;private string getdbaseconnectionstring(){ return configurationsettings.appsettings["dbconnstr"];
新聞熱點
疑難解答
圖片精選