日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Enterprise Library 4 数据访问应用程序块

發布時間:2023/11/27 生活经验 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Enterprise Library 4 数据访问应用程序块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

Enterprise Library 數據訪問應用程序塊簡化了實現常規數據訪問功能的開發任務。應用程序可以在各種場景中使用此應用程序塊,例如為顯示而讀取數據、傳遞數據穿過應用程序層( application layers)、以及將修改的數據提交回數據庫系統。應用程序塊包含對存儲過程和內聯 SQL 的支持。常規內部(housekeep)處理,如管理連接、創建并緩存參數,都封裝在應用程序塊的方法中。換句話說,數據訪問應用程序塊在簡單易用的類中提供了對 ADO.NET 的最常用的特性的訪問;這提高了開發人員的工作效率。
ADO.NET 2.0 提供了如 DbCommand 類和 DbConnection 這樣的類,這些類有助于從任何特定數據庫實現中抽象出數據提供程序。數據訪問應用程序塊利用了這些類,并且提供了加強支持數據庫特定特性封裝的模型,例如參數發現和類型轉換。因此,應用程序可以在不修改客戶代碼的情況下從一個數據庫移植到另一個數據庫。數據訪問應用程序塊包括一個抽象基類,它定義了一個通用的接口,并提供了許多在 ADO.NET 2.0 中可用的數據訪問方法所需要的實現。
應用程序塊還包含了專用于 Microsfot SQL Server、Microsoft SQL Server CE、和 Oracel 的類。這些類完成對特定數據庫類型的操作。應用程序的代碼只為一種數據庫而編寫,例如 SQL Server,可以看到有許多為另一種數據庫編寫的代碼是一樣的,例如 Oracle 。
數據訪問應用程序塊的另一個特性是,應用程序代碼可以由一個 ADO.NET 連接字符串的名字,如"Customer" 或者 "Inventory" ,而引向一個特定的數據。應用程序代碼可以指定一個數據庫命名實例,并傳遞此參數到 DatabaseFactory.CreateDatabase 方法。每個命名數據庫都有連接字符串保存在配置文件中。通過修改配置文件中的設置,開發人員可以在不同的數據庫配置下使用應用程序而不需要重新編譯代碼。
數據訪問應用程序塊提供了下列好處:

  • 使用了由 ADO.NET 2.0 提供的功能并與其一起使用,可以同時使用 ADO.NET 和應用程序塊的功能。
  • 減少編寫重復代碼完成標準任務的需要。
  • 有助于維護一致的數據訪問實踐,無論是在應用程序內部還是企業間。
  • 減少了變更數據庫類型的困難。
  • 將開發人員從學習用于不同數據庫的不同編程模型中解放出來。
  • 減少了在開發人員移植應用程序到另一種數據庫時不得不編寫的代碼的數量。

普通場景
開發人員經常編寫使用數據庫的應用程序。因為它太普遍了,開發人員可能會發現他們為每個應用程序在重復編寫同樣的代碼。另外,這些應用程序可能需要與不同的數據庫一起工作。盡管任務是相同的,代碼也必須適配以適應每個數據庫的編程模型。數據訪問應用程序塊通過提供完成最常用的數據訪問任務的邏輯來解決這些問題。開發人員僅需要做如下事情:

  • 創建一個 database 對象。
  • 提供用于命令的參數,如果需要的話。
  • 調用適當的方法,這些方法已經過性能優化,并且是可移植的。


數據訪問應用程序塊可以透明的與 SQL Server、SQL Server CE、和 Oracle 數據庫一起工作。數據訪問應用程序塊為解決開發人員在編寫數據庫應用程序時所面對的絕大多數普通任務而設計。這些任務根據場景進行了組織。每個場景都人出了一個真實世界條件下的示例,例如從分類中獲取信息或者未完成銀行事務,描述了條件所要求的數據庫功能,并展示完成任務的代碼。
根據場景組織這些任務的目的是給代碼一些上下文,來替代展示一組孤立的方法,而沒有它們最好使用在哪兒的意義,場景為代碼提供了一種設置,將它放置在其應用程序必須訪問數據庫的許多開發人員所熟悉的條件中。
場景如下:

  • 使用 DataReader 獲取多行數據
  • 使用 DataSet 獲取多行數據
  • 運行一個命令并獲取輸出參數
  • 運行一個命令并獲取單值項
  • 在一個事務中執行多個操作
  • 從 SQL Server 中獲取 XML 數據
  • 使用包含在 DataSet 對象中的數據更新數據庫

示例應用程序代碼
下列代碼展示了如何調用一個存儲過程并返回一個 DataSet

Database db = DatabaseFactory.CreateDatabase(); 
?
DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory"); 
?
// Retrieve products from category 7.
db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, 7); 
?
DataSet productDataSet = db.ExecuteDataSet(dbCommand); 

從3.1版本之后修改的特性

一般情況下,使用數據訪問應用程序塊的早期版本發布構建的應用程序不需要修改任何代碼就能使用 May 2008 發行的功能。可能需要更新引用以指向新的程序集,并更新配置文件以引用正確的應用程序版本。然而在version 3.1 (May 2007)所做的一些修改會影響到你從早期版本遷移到現在的版.下面描述這些改變:

.NET Framework 2.0 TransactionScope 類

已經修改某些 Database 類的方法以使用 .NET Framework 2.0 的 TransactionScope 類。這些方法,例如 ExecuteNonQuery ,已通過用 GetOpenConnection 方法替換掉 GetConnection 方法來修改為識別 TransactionScop 實例的有效時機。如果編寫了一個繼承自 Database 類的類,將需要考慮這些變化來重寫代碼。如果繼續使用 GetConnection 方法,將會收到一個編譯錯誤。
另外,如果應用程序使用了 ExecuteXmlReader 方法,可能需要重寫代碼以測試查看在關閉連接前 TransactionScope 實例是否是有效的。

SQL Server Compact Edition

Enterprise Library 3.1 – May 2007 和之后版本支持 SQL Server Compact Edition (CE)。SQL Server CE 提供了精減的關系數據庫的特性,以用于桌面和移動應用程序,這些程序需要本地數據庫存儲但又不需要完整的 SQL Server 的功能。

何時使用數據訪問應用程序塊

?

數據訪問應用程序塊包含少量簡化絕大多數訪問數據庫的普通方法的方法。每個方法都封裝了獲取數據所需要的邏輯以及管理數據庫連接。如果應用程序中使用標準的數據訪問技術就可以考慮使用應用程序塊。
應用程序塊補充了 ADO.NET 2.0 中的代碼,以讓你在不同的數據庫類型中使用同樣的代碼。它包含了用于 SQL Server 和 Oracle 數據庫的類。這些類包含了提供特定數據庫特性如參數處理和游標的實現的代碼。另外,GenericDatabase 類允許使用應用程序塊與任何配置的 ADO.NET 2.0 DbProviderFactory 對象一起使用。可以通過添加新的惟數據庫特定特性或者提供已有數據庫自定義實現的數據庫類型來擴展應用程序塊。僅僅需要在在一個用于目標數據庫的 ADO.NET 2.0 DbProviderFactory 類。

何時直接使用 ADO.NET


數據訪問應用程序塊是 ADO.NET 的一個補充;而不是替換。應用程序塊提供了簡化和方便,同時幫助開發人員以最佳實踐使用 ADO.NET 。如果應用程序需要以特殊的方法獲取數據,或者代碼需要定制以利用特定于特定數據庫的特性,使用 ADO.NET 可能更適合。

使用數據訪問應用程序塊開發應用程序

首先解釋了如何配置應用程序塊并將它添加到應用程序中。然后,在關鍵場景中,解釋了如何在特定場景中使用應用程序塊,例如獲取單個項或者使用 DataSet 對象獲取多行。最后,在開發任何細節中,給出了關于如連接管理、參數處理和處理異常等方面的更多信息。本主題假設使用的是原始的應用程序塊,即沒有擴展的。要學習如何添加功能,請參見擴展和修改數據訪問應用程序塊。

輸入配置信息

下面這些過程展示了如何配置數據訪問應用程序塊。
此過程解釋了如何配置數據訪問應用程序塊。與節點關聯的屬性顯示在右邊的面板里。
添加數據訪問應用程序塊

  1. 打開配置文件。更多信息,請參數配置應用程序塊。
  2. 右單擊Application Configuration,指向 New ,然后單擊 Data Access Application Block


下一過程解釋了如何配置默認的數據庫實例,此實例在應用程序調用不指定實例名稱的 DatabaseFactory.CreateDatabase 方法時使用。
配置默認數據庫

  1. 在右面板中,展開 DefaultDatabase 屬性。
  2. DefaultDatabase 屬性輸入連接字符串的名稱或者從下拉列表中選擇它。默認的連接字符串名稱是 ConnectionString 。
  3. (可選的)輸入一個新的名稱來設計 Name 屬性,默認名稱是 ConnectionString
  4. ProviderName 屬性節,如果愿意,可能修改提供程序的名稱。輸入提供程序的名稱或者從下拉列表中選擇它。提供程序的默認名稱是 System.Data.SqlClientProviderName 屬性必須是一個在 DBProviderFactory 類中指定的提供程序的名稱。


下一過程解釋了如何為命名數據庫實例創建連接字符串。當配置控制臺保存連接字符串時,它生成了一個以 name = value 格式保存值對的以分號分割的字符串。例如,如果使用配置控制臺來用默認值生成連接字符串,配置控制臺臺將生成下列連接字符串。

Database=Database;Server=(local)\SQLEXPRESS;Integrated Security=SSPI;


配置連接字符串

  1. 單擊 ConnectionString 節點。
  2. (可選的)輸入一個新的名稱以設置 Name 屬性,這是 ConnectionString 節點的名稱。默認的名稱是 ConnectionString
  3. (可選的)在 ProviderName 屬性節,修改提供程序的名稱。輸入提供程序的名稱或者從下拉列表中選擇它。默認的提供程序的名稱是 System.Data.SqlClientProviderName 屬性必須是一個指定在 DbProviderFactory 類中的提供程序的名稱。
  4. 用下列值更新 ConnectionString 屬性。例如:
Database=Database;Server=(local)\SQLEXPRESS;Integrated Security=SSPI


下一過程展示了如何配置一個 SQL Server CE 數據庫。如果應用程序總是使用在配置期間命名的單一文件,這些步驟是合適的。關于 SQL Server CE 的更多信息,請參見創建數據庫對象的細節。
配置 SQL Server CE

  1. 右單擊 Custom Provider Mappings,指向 New ,然后單擊 Provider Mapping
  2. 屬性面板中單擊Nmae,在下拉框中選擇Microsoft.SqlServerCe.Client
  3. 屬性面板中單擊 TypeName 屬性。單擊省略號(...)按鈕
  4. Type Selector 中,找到并雙擊 SqlCeDatabase
  5. ConnectionStrings 節點上右單擊并單擊 New ,然后單擊 Connection String
  6. (可選的)輸入新的名稱以設置 Name 屬性。這是 ConnectionString 節點的名稱。默認的名稱是 ConnectionString
  7. ProviderName 屬性節,修改提供程序的名稱為 Microsoft.SqlServerCe.Client
  8. ConnectionString 屬性節,輸入理想的 SQL Server CE 連接字符串,例如:
Data Source='C:\MyApp\MyDatabase.sdf'


下一過程展示了如果添加 Oracle 包。Oracel 包服務是分組存儲過程到普通組的一種方式,通常基于它們的功能。當應用程序調用在包中的 Oracle 存儲過程時,代碼必須用包名做為存儲過程的前綴。例如,要調用在命名為 Employee_pkg 的包中的名為 GetEmployeeName 的過程,將調用 Employee_pkg.GetEmployeeName
將這段代碼加入到應用程序中將降低可移植性,因為語法專用于 Oracle 。另一種替換做法是,數據訪問應用程序塊會用包名做為存儲過程的前綴。這意味著客戶端代碼在調用存儲過程時不需要指定包名。要做到這一點,應用程序塊使用在配置文件中的信息。OraclePackage 節點保存了一個名稱/前綴對。名稱是包的名稱,前綴是一個與包相關的字符串。所有以指定的前綴開始的存儲過程都假定在相關的包內。
當應用程序調用一個存儲過程時,數據訪問應用程序塊檢查看是否以配置文件中的某個前綴開始。如果是,應用程序塊為存儲過程加上相應的包名前綴。(應用程序塊將使用找到的第一個匹配)。如果指定一個星號(*)為前綴,關聯包將用于所有存儲過程。
配置 Oracle 包

  1. 右單擊 ConnectionString ,指向 New ,然后單擊 OraclePackages
  2. 單擊 OraclePackage
  3. 輸入 Oracle 包的名稱以修改 Name 屬性。默認為 OraclePackage
  4. 輸入 Prefix 屬性的值。

下一過程解釋了如何通過關聯提供程序和數據庫全名稱來添加自定義的提供程序映射。
配置自定義的提供程序

  1. 右單擊 CustomProviderMappings 節點,指向 New ,然后單擊 ProviderMapping
  2. (可選的)輸入新的名稱以設置 Name 屬性。輸入提供程序的名稱或從下拉列表中選擇。默認的提供程序是 System.Data.SqlClientProviderName 屬性必須是一個在 DbProviderFactory 類中指定的提供程序名稱。
  3. TypeName 屬性節中。單擊省略號按鈕(...)并使用'Type Selector 選擇 Enterprise Library 數據庫類型的全名稱。

可以手工編輯 XML 數據,但 Enterprise Library 極大的簡化了此任務。如果選擇手工編輯 XML ,則要使用包含在本主題中的模式信息。
配置文件有如下的節處理程序聲明:

<configSections><section name="dataConfiguration"type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,Microsoft.Practices.EnterpriseLibrary.Data, Version=4.0.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35" /><section name="oracleConnectionSettings" type="Microsoft.Practices.EnterpriseLibrary.Data.Oracle.Configuration.OracleConnectionSettings,Microsoft.Practices.EnterpriseLibrary.Data, Version=4.0.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>

節處理程序聲明包括配置設置節的名稱和處理節中配置數據的節處理程序的類名。第一個配置設計節的名稱為 dataConfiguration ,節處理程序的類名為 DatabaseSettings (在 Microsoft.Practices.EnterpriseLibrary.Data.Configuration 命名空間中)。
第二個配置設置節是 oracleConnectionSettings 。節處理程序類的名稱為 OracleConnectionSettings (在 Microsoft.Practices.EnterpriseLibrary.Data.Oracle.Configuration 命名空間中 )。
connectionStrings 元素
connectionStrings 元素列出了可被應用程序使用的數據庫連接,此元素不是必須的。
屬性和子元素
下面的節描述了 connectionStrings 元素的屬性和子元素。
add 子元素
add 元素是 connectionStrings 元素的子元素。add 元素添加一個數據庫連接,此元素不是必須的,可以有多個 add 元素。

providerMappings 子元素
這是一個 dataConfiguration 元素的子元素,只有在通過派生自 ADO.NET 的 Database 類而不是 GenericDatabase 類的提供程序時才需要指定提供程序的映射。SQL Server 和 Oracle 數據庫默認已配置,所以不需要再在此節中指定。指定在此節中的一個數據庫示例是 SQL Server CE 。
add 子元素
addproviderMappings 元素的子元素。add 元素添加一個數據庫連接。此元素不是必須的,可以有多個 add 元素。

表3 列出了素的屬性

packages 子元素
這是 add 元素的一個子元素,指定一個 Oracle 的包。此元素是必須的。
add 子元素
這是 packages 元素的一個子元素。 add 元素添加一個 Oracle 的包。此元素不是必須的。可以有多個 add 元素。
屬性
表 5 列出了 add 子元素的屬性。

添加應用程序代碼

數據訪問應用程序塊為支持絕大多數訪問數據庫場景而設計。在添加自己的應用程序代碼時,請參考在關鍵場景節中的場景,然后選擇一種與自己的情況最匹配的方法。使用場景中的代碼,或者如果需要,修改它以適合自己的需要。
首先,必須準備自己的應用程序以使用數據訪問應用程序塊。
準備應用程序

  1. 添加到數據訪問應用程序塊程序集的引用。在 Visual Studio 中,在解決方案管理器中右單擊項目節點,然后單擊添加引用。單擊瀏覽標簽,然后導航到 Microsoft.Practices.EnterpriseLibrary.Data.dll 的位置。選擇程序集,然后單擊確定以添加引用。
  2. 按同樣的步驟,添加到 Enterprise Library 內核程序集 Microsoft.Practices.EnterpriseLibrary.Common.dllMicrosoft.Practices.ObjectBuilde2r.dll 的引用。
  3. (可選的) 要不帶完整的精確的元素引用使用來自加密應用程序塊的元素,可以添加下列的 using 語句(C#)或者 Imports 語句(Visual Basic)到源代碼文件的頂部。
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;

創建 Database 對象
所有數據訪問方法都相對于 Database 的對象。可以使用 DatabaseFactory 來創建 Database 對象。由工廠生成的 Database 對象的特定類型是由應用程序的配置信息決定的。
可以使用配置控制臺指定一個默認的數據庫實例。在不傳遞數據庫實例名調用 CreateDatabase 方法時,DatabaseFactory 創建由默認實例指定的 database 。下列應用程序代碼展示了如何創建一個默認實例的 Database 對象。

Database db = DatabaseFactory.CreateDatabase();

另一種方法是,應用程序代碼可以指定一個命名的數據庫實例。例如,如果使用配置控制臺創建了名為 "Sales" 的實例,則為特定實例創建 Database 對象的代碼可能如下。

Database db = DatabaseFactory.CreateDatabase("Sales");

如果要創建的數據庫的連接字符串是已知的,也要以放棄應用程序的配置信息,而是使用構造函數直接創建 Database 對象。因為 Database 類是一個抽象基類,所以必須構建一個它的派生類型。派生的 Database 類型決定了 ADO.NET 數據提供程序。例如,SqlDatabase 類使用 SqlClientFactory 提供程序,SqlCeDatabase 使用 SqlCeProviderFactory 提供程序,以及 OracleDatabase 使用 OracleClientFactory 提供程序。為連接字符串構建正確類型的 Database 類是你的責任。
下列代碼使用提供的連接字符串創建了一個 SqlDatabase 對象。

// Assume the method GetConnectionString exists in your application and 
// returns a valid connection string.
string myConnectionString = GetConnectionString();SqlDatabase sqlDatabase = new SqlDatabase(myConnectionString);

如果通過不是 ADO.NET SQL 數據提供程序或者 Oracle 數據提供程序的數據提供程序使用一個連接字符串,可以創建一個 GenericDatabase 對象。在創建 GenericDatabase 對象時,必須支持 DbProviderFactory 對象。
選擇適當的重載方法
每個數據訪問方法都有多個重載。下列描述和指南可以幫助你選擇合適的重載:

  • 有可以接受 ADO.NET DbCommand 對象的重載。這些重載為每個方法提供了最大的靈活性和控制。
  • 有接受存儲過程名稱和用于存儲過程參數值的值集合的重載。這些重載在應用程序調用僅有輸入參數的存儲過程時比較方便。
  • 有接受 System.Data.CommandType 和表示命令的字符串的重載。這些方便的重載在應用程序執行不帶參數的內聯 SQL 語句或存儲過程時使用。
  • 最后,以上每個重載都包含一個接受一個事務的重載。這允許在一個已存在的事務中執行方法時使用需要的重載類型。


每個關鍵場景示范了特定方法可用重載之一,許多場景都可以使用其他可用的重載完成。

創建 Database 對象的細節

可以使用工廠創建一個 Database 對象或者直接構建一個。工廠使用配置信息決定連接字符串、ADO.NET 數據提供程序和要構建的適當的派生自數據訪問應用程序塊 Database 的對象。另一種時,傳遞所有需要的信息給對象的構造函數直接創建 Database 對象。
在要使用由 Enterprise Library 支持的保存在某個位置的配置信息時或者使用由 ADO.NET 管理的連接字符串時使用工廠。例如,使用工廠用保存在應用程序配置文件中的 <connectionStrings> 節中的連接字符串信息創建 Database 對象。也可以使用工廠用保存在另一個配置源中的連接字符串構建一個 Database 對象。必須使用另一個默認配置源來配置應用程序,以允許工廠用保存在那個配置源中的連接字符串創建對象。在從不是默認配置源中的某些源中獲取連接字符串時,可以使用構建函數。
CreateDatabase 方法是 DatabaseFactory 類的一個靜態方法。工廠基于配置文件中的信息創建一個正確的 database 類,并返回基類的子類的對象:Database 到客戶代碼。除非需要特定于特殊數據庫類型的命令,例如 SQL Server ,否則應該僅使用 Database 基類的的可用方法以保持應用程序所使用的數據庫是不可知的。特定的數據庫派生類型的創建對應用程序代碼而言是透明的,因此,同樣可以不需要考慮所使用的數據庫類型。
可以使用 CreateDatabase 方法來基于默認配置指定創建的數據庫類型。通過修改默認配置,可以使未經修改的應用程序運行于不同的數據庫。
也可以使用命名的數據庫實例,例如在應用程序中的 "Customers" 。工廠使用配置文件中的連接字符串來查找與特定命名實例相關的信息以創建正確的數據庫類型。
如果需要使用某個或另一個數據庫特定的命令,就必須通過向下類型轉換(downcasting)指定期望由工廠創建的數據庫類型。
最后,可以忽略應用程序的配置信息直接創建一個 DataBase 對象子類型的 Database 對象。要做到這一點,必須知道要創建的數據庫的類型,以及連接字符串和其他任何子類型需要的信息。
創建默認數據庫
不指定參數的調用工廠的 CreateDatabase 方法將創建一個默認的 database 。配置文件決定哪個命名實例是默認實例。可以使用配置控制臺修改默認實例。
下列代碼展示了如何創建一個標記為默認實例的 database 對象。

Database dbSvc = DatabaseFactory.CreateDatabase();

注意
如果配置文件沒有指定默認實例,并且客戶代碼在調用 CreateDatabase 方法時也沒有指定參數,應用程序塊將拋出異常。

使用實例
要使用實例,可以通過邏輯名稱在應用程序代碼中引用 database ,并且修改數據庫配置信息(如位置或連接字符串信息)而不用重新編譯代碼。
下列示例展示了如何使用名稱“Sales”創建 database 。

// Use a named database instance that refers to an arbitrary database type,
// which is determined by configuration information.
Database myDb = DatabaseFactory.CreateDatabase("Sales");
創建特定的 Database 類型
如果必須使用專用于特定數據庫類型的方法,在創建數據庫時可以指定 database 類型。下列代碼要求工廠創建一個 SqlDatabase 對象。

// Create a SQL database.
SqlDatabase dbSQL = DatabaseFactory.CreateDatabase("Sales") as SqlDatabase;

同樣,要創建一個 Oracle 數據庫,使用 OracleDatabase 。要創建一個 SQL CE 數據庫,使用 SqlCeDatabase 類型。
不使用配置創建一個數據庫
可以通過提供一個連接字符串給 database 類構造函數來不使用配置數據的創建一個數據庫對象。下列代碼展示了如何創建一個 SqlDatabase 對象。

// Assume your application contains the routine GetConnectionString.
string myConnectionString = GetConnectionString();
SqlDatabase sqlDatabase = new SqlDatabase(myConnectionString);

下列代碼展示了如何創建一個 GenericDatabase 對象。必須提供連接字符串和 DbProviderFactory 對象。在這種情況下,DbProviderFactory 對象是 OdbcFactory 。

GenericDatabase db = new GenericDatabase(connectionString, OdbcFactory.Instance);

使用 SQL Server CE
SQL Server CE 是一個小型的、進程內的數據庫,它提供了關系數據庫的必須功能,目的在于需要本地數據存儲但不需要 SQL Server 的完整功能的桌面和移動應用程序。每個數據庫都保存在一個文件中,默認情況下,擴展名為 .sdf 。使用 CreateFile 方法可以創建一個新的空數據庫,此方法使用來自連接串的文件名。
對于 SQL Server CE ,打開一個連接就是打開數據庫文件。結果是,為每個請求創建和釋放連接將非常緩慢。為了避免這些性能問題,使用 SQL Server CE 的應用程序通常在使用數據庫期間盡可能長的保存連接打開。
在第一次調用 Database 類的方法時,提供程序創建一個附加的 “keep alive”連接,它在內存中保持了數據庫引擎。應用程序為每個 Database 類方法的調用打開和關閉其他的連接,但關閉這些連接不會關閉 “keep alive”連接。
要打開一個數據庫,使用 CreateConnection 方法打開到它的連接。這個方法創建了 “keep alive”連接。當使用完數據庫后,必須使用 CloseSharedConnection 方法關閉到數據庫的 “keep alive”連接。對于每個連接字符串僅有一個 “keep alive”連接,盡管對于同樣的連接字符串可以有多個打開的連接。
因為 SQL Server CE 是一個進程內的數據庫,對數據庫的多個調用將是快而有效的。SQL Server CE 不支持存儲過程。如果試圖使用任何 Execute 方法,如 ExecuteScalarExecuteNonQuery ,以一個存儲過程做為參數的話,應用程序塊將拋出異常。不用存儲過程,可以使用內聯的 SQL 語句來代替。在此有些 Execute 方法的重載是接受一個 SQL 語句為參數的。因為存儲過程不受支持的同樣原因,只能在一個請求中發送一條 SQL 語句。
SQL Server CE 有一個名為 SqlCeResultSet 的特殊結果集。這是查詢返回的結果集類型。它支持在數據庫中的查詢、前向和后向移動、以及修改數據。
關于 SQL Server CE 的一般信息,請參見 Microsoft Web 站點上的 Microsoft SQL Server: SQL Server 2005 Compact Edition 。相關 API 的信息,請參見 MSDN 上的 System.Data.SqlServerCe 命名空間頁。

注意 SQL Server CE 僅在完全信任環境中操作。

通過 TransactionScope 類使用 Oracle
盡管可以通過 Oracle 客戶端來使用 TransactionScope 類,但事務總是被處理為分布式事務而不是輕量級的事務。分布式事務有較高的性能開銷。
.NET Framework 托管的用于 Oracle 的提供程序需要一個名為 oramts.dll 的文件以使用 TransactionScope 類。更多信息,請參見 Microsoft 幫助和支持 Web 站點。
如果通過 Microsoft 事務服務器使用 Oracle,請參見 Oracle Web 站點上的 Oracle Services for MTS以獲得適當的下載。
使用提示
DatabaseFactory 對象基于 ADO.NET 的 DbProviderFactory 對象決定哪種 Database 對象被創建,DbProviderFactory 與連接字符串相關聯。連接字符串保存在配置文件的 <connectionStrings> 節中。默認情況下,應用程序塊為 System.Data.SqlClient 類型的數據提供程序創建 SqlDatabase 類型的 Database 對象,為 System.Data.SqlServerCe 類型的數據提供程序創建 SqlCeDatabase 類型的對象,為 System.Data.OracleClient 類型的數據提供程序創建 OracleDatabase 類型的對象,為其他所有數據提供程序類型創建 GenericDatabase 類型的對象。
GenericDatabase 類僅支持由 ADO.NET 提供功能的數據庫提供程序。特別的,支持參數發現的數據訪問重載無法工作。GenericDatabase 可以由任何 .NET 托管的提供程序使用,包括 .NET Framework 2.0 中的 ODBC 和 OLE-DB 提供程序。可以通過在配置文件中的配置設置來覆蓋數據提供程序類型和 Database 對象類型之間的映射。更多信息,請參見數據訪問應用程序塊的設計。

創建 DbCommand 對象

數據訪問應用程序塊提供了獲取 ADO.NET DbCommand 對象的的統一方法。應用程序塊的數據訪問方法包含了接受 DbCommand 對象的重載。如果用 DbCommand 對象來使用重載,在調用存儲過程時將可以進行更多的控制。例如,如果使用 DbCommand 對象,就可以使用在輸出參數中返回多個結果的存儲過程。另外,DbCommand 對象允許指定存儲過程的超時值。
創建 DbCommand 對象的方法分為二種類型:

  • 表示存儲過程調用的那些方法(例如,GetCustomers)
  • 表示 SQL 文本命令的那些方法(例如,Select CustomerID, Fullname From Customers )


調用的獲取 DbCommand 對象的方法由是要執行內聯的 SQL 還是調用存儲過程來決定。用于存儲過程的創建 DbCommand 對象的方法還提供參數緩存。關于參數緩存的更多信息,請參見處理參數。
所有 DbCommand 對象的創建都使用 Database 類的方法,這些方法如下:

  • GetStoredProcCommand。此方法用于存儲過程命令。
  • GetSqlStringCommand。此方法用于 SQL 文本命令。


二個方法都返回一個 DbCommand 對象。

注意:SQL Server CE 不支持存儲過程,用內聯 SQL 語句來代替。更多信息,請參見創建 Database 對象的細節。

用于 SQL 語句的 DbCommand對象
使用 GetSqlStringCommand 方法創建用于內聯 SQL 語句的 DbCommand 對象。特定的 SQL 命令在方法調用時做為一個參數進行傳遞。
下列代碼展示了如何使用 GetSqlStringCommand

Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "Select CustomerID, LastName, FirstName From Customers";
DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);

用于存儲過程的 DbCommand 對象
要執行存儲過程,必須使用 GetStoredProcCommand 方法來創建 DbCommand 對象。要執行存儲過程的名稱在方法調用時做為一個參數傳遞。
下列代碼展示了如何使用 GetStoredProcCommand

Database db = DatabaseFactory.CreateDatabase();DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory"); 

注意:存儲過程的參數受 Database 類的方法的支持。關于如何使用存儲過程參數參數的更多信息,請參見處理參數。

?

管理連接

數據庫連接是有限資源,它們的妥善管理對可擴展的應用程序來說是必不可少的。僅在需要時保持連接打開并盡快關閉是一個很好的實踐。根據設計,絕大多數的 Database 類方法在每次調用時打開和關閉到數據庫的連接。因為,應用程序代碼不需要包含用于管理連接的代碼。(默認情況下,基于性能的原因,ADO.NET 將連接返回到連接池中,而不是關閉他們。因此,不需要緩存 Database 對象。)
例如,ExecuteDataSet 返回包含所有數據的 DataSet 對象。這給了你一個自己的本地副本。對 ExecuteDataSet 的調用打開了一個連接、組裝了一個 DataSet、然后在返回結果前關閉連接。
下列代碼示范了 ExecuteDataSet 方法的使用。

Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "Select ProductID, ProductName From Products";
DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);
// No need to open the connection; just make the call.
DataSet customerDataSet = db.ExecuteDataSet(dbCommand);

然而,在關閉連接時有一些未清理的其他情況。一個例子就是 ExecuteReader 方法。此方法返回實現 IDataReader 接口的對象。Database 基類有一個返回 DbDataReader 對象的默認實現。DbDataReader 對象被設計用來讀取需要的數據的特定部分,它需要一個打開的連接。換句話說,它不知道應用程序何時不再需要 DbDataReader 。如果數據訪問應用程序塊在返回 DbDataReader 之前就關閉了連接,DbDataReader 對客戶代碼而言是無用的。因此,DbDataReader 方法指定底層的 ADO.NET 在 DbDataReader 完成后自動關閉連接。在這種情況下,它被認為是由應用程序確定 DbDataReader 及時關閉的最好方法,可以使用 DbDataReader.close 方法顯示的關閉 reader 或者強制 DbDataReader 的銷毀,這是 Close 方法被調用的結果。
下列代碼示范了對 ExecuteReader 方法的調用。using 語句(在 Visual Basic 中為 Using )確保 DbDataReader 對象被銷毀,并在銷毀的過程中關閉 DbDataReader 對象。

Database db = DatabaseFactory.CreateDatabase();DbCommand dbCommand = db.GetSqlStringCommand("Select Name, Address From Customers");
using (IDataReader dataReader = db.ExecuteReader(dbCommand))
{
// Process results
} 
?
使用 TransactionScope 類

在此對 Database 類的某些方法進行了一些修改,以利用 .NET Framework 2.0 的 TransactionScope 類。此類自動將數據庫調用加入到一個外圍的事務中。這在將業務對象加入到一個事務中而不傳遞事務到這些業務對象中時非常有用。以下是 TransactionScope 類的使用的基本模型。

using (TransactionScope scope = new
?????????? TransactionScope(TransactionScopeOption.RequiresNew))
{
??? int rows = db.ExecuteNonQuery(CommandType.Text, insertString);
??? rows = db.ExecuteNonQuery(CommandType.Text, insertString2);
}

二個 ExecuteNonQuery 方法將行插入到了在創建 TransactionScope 實例時定義的事務中。
TransactionScope 類創建了一個本地的、輕量級的事務。它假定為發生在事務中的所有的數據庫調用使用一個連接。這意味著,做為傳遞 DbTransaction 實例的另一種方法,簡單的傳遞連接,然后 .NET Framework 自動為執行的每個命令設置了連接。
Enterprise Library,換句話說,通常為每個請求打開并關閉連接。此方法與 TransactionScope 類工作的方法不兼容。如果有多個連接,TransactionScope 類將認為事務是分布式事務。分布式事務比本地事務有顯著的性能和資源消耗。
要避免這些,Database 類的方法,如 ExecuteDataSet ,識別 TransactionScope 實例活動的時機,并添加 database 調用到此事務中。如果事務的當前活動是使用 TransactionScope 實例的結果,Database 類方法會使用單一的連接。
特別的,GetOpenConnection 方法替換了 Database 方法中的 OpenConnection 方法,GetOpenConnection 方法返回一個連接包裝器。如果沒有事務正在處理,方法將銷毀包裝器。然而,當事務還在處理中時,方法將保持連接打開。
如果使用 ExecuteXmlReader 方法,將測試看 TransactionScope 實例是否是活動的。此方法將返回保持 reader 使用的連接的 XmlReader 對象。當 reader 使用結束后,最后的方法就是關閉此連接。然而,如果使用的是 TransactionScope 的實例,必須不能這么做,因為關閉此連接并創建一個新的連接將會改變輕量級的事務為分布式事務。

注意:多線程中共享在一個 transaction scope 中的同一事務將導致下列異常:“Transaction context in use by another session.”

創建可移植的數據庫應用程序

如果應用程序必須工作在多個數據庫類型下,有些問題就必須要考慮。
Oracle
如果使用 LoadDataSet 方法加載數據,它將不會轉換 Guid 和 Boolean 數據類型。這是因為架構無法決定數據的值是 Guid 還是簡單的 bype">">。數據將返回為 byte[ 列。
當你為返回多個游標的存儲過程創建 DbCommand 對象時,必須傳遞一個對象數組到 GetStoredProcCommand 方法。數組的大小必須與由存儲過程返回的游標數量相同。例如,下列代碼示范了如何為返回二個游標的存儲過程傳遞對象數組到 GetStoredProcCommand 。

Database db = DatabaseFactory.CreateDatabase();
object results = new object2;
DbCommand dbCommand = db.GetStoredProcCommand("GetCustomersAndSuppliers", results);

如果存儲過程僅返回一個游標,則不必須傳遞對象數組。
用于創建可移植數據庫應用程序的建議。
在此有一些用于創建可移植數據庫應用程序的建議:

  • 避免用存儲過程參數名使用數據庫專用令牌。用于特定提供程序的 Database 派生類包含了調整需要的參數名的代碼。例如,在支持到 SQL Server 數據庫的存儲過程參數名中不要包含 "@" 字符。下列代碼展示了如何調用 AddInParameter 方法通過名稱 CategoryID 創建參數。當使用 SqlDatabase 對象執行此代碼時,提供程序用 "@" 做為參數名的開頭。
Database db = DatabaseFactory.CreateDatabase();DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory");db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, 100);
  • 總是通過 database 對象獲取參數值。
  • 考慮后端關系數據庫管理系統(RDBMS)的大小寫敏感。例如,在 SQL Server 2000 中的字符串比較是大小寫不敏感的,但是在 Oracle 8i 和 DB2 中是大小寫敏感的。要開發一個可移植的應用程序,就必須編寫自己的比較邏輯為大小寫不敏感的或者強迫應用程序僅為在比較操作中使用的列存儲大寫或小寫。
  • 避免使用 RDBMS 專用數據類型,例如 OracleBlob
  • 在執行存儲過程時避免使用返回值,而是使用輸出參數。
  • 在添加參數到參數集合中時,確認在應用程序代碼中的順序與數據庫中的順序相匹配。OLE DB 提供程序使用順序來執行存儲過程而不是名稱,所以以正確的順序添加集合是很重要的。
  • 如果在應用程序代碼必須使用內聯的 SQL ,確認 SQL 語法對于應用程序將運行的數據庫類型都是可用的。
  • 避免傳遞 null 值到值類型的存儲過程參數。如果需要通過 SQLJ 存儲過程使用 DB2 的可移植接口,這些做將可能無法正常工作。
處理異常

處理異常的策略在任何企業應用程序中都是必不可少的。下列信息將幫助你添加數據訪問應用程序塊到管理異常的方法中去:

  • CreateDatabase 方法使用配置信息,其可能的結果在配置相關的異常中。
  • Database 方法使用 ADO.NET 和底層數據庫提供程序。由 ADO.NET 拋出的異常由數據訪問應用程序塊為度量的目的而捕獲,然后再次拋出。
  • 充分處理異常通常要求訪問特定的異常類型。可以包

使用 CommandBehavior.CloseConnection 調用 ExecuteReader。它在 DataReader 關閉時關閉連接。如果在一個 try 塊中使用 ExecuteReader ,可以添加一個 finally 語句并關閉返回的 DataReader 對象,就像展示在下列示例中的一樣。

Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory"); 
IDataReader dataReader = null;
try
{
  //...
  dataReader = db.ExecuteReader(dbCommand);
}
catch(Exception ex)
{
  // Process exception
}
finally
{
  if (dataReader != null)
    dataReader.Close();
}

另一種方法是,可以包含 using 語句來銷毀 DataReader 對象,這將導致它的關閉,就像展示在下列示例中一樣。

Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory"); 
using (IDataReader dataReader = db.ExecuteReader(dbCommand))
{
    // Process results
}

對于在 .NET 中的異常管理的設計和實現原則,請參見異常管理架構指南。

處理參數

絕大多數存儲過程接受用于輸入存儲過程或在輸出時設置的值的參數。就像使用 ADO.NET 一樣,數據訪問應用程序塊允許開發人員指定參數所有的屬性。這些屬性可以包括方向、數據類型和長度。此方法叫做顯式參數處理。然而,為了方便,可以僅指定用于輸入參數的值。在這種情況下,應用程序塊將查找并提供參數的屬性。此方法叫參數發現。
顯式參數處理
Database 類包含了不同的用于傳遞參數到存儲過程的方法。此類還包含了用于設置和測試這些參數的值的方法。這些方法如下:

  • AddParameter。此方法傳遞一個參數(輸入或輸出)到存儲過程。
  • AddInParameter。此方法傳遞輸入參數到一個存儲過程。
  • AddOutParameter。此方法添加了一個輸出參數到存儲過程。
  • GetParameterValue。此方法查找指定的參數的值。
  • SetParameterValue。此方法在使用同樣的連接和命令,但有不同的參數值時進行多個插入時設置指定參數的值。


下列代碼示范了如何使用 AddInParameterAddOutParameter 指定參數。

Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "GetProductDetails";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);db.AddInParameter(dbCommand, "ProductID", DbType.Int32, 5);
db.AddOutParameter(dbCommand, "ProductName", DbType.String, 50);
db.AddOutParameter(dbCommand, "UnitPrice", DbType.Currency, 8);

注意:前面的代碼不包括專用于數據庫類型的參數名稱令牌。因此,代碼保留了跨多個不同數據庫提供程序的通用性。當此代碼運行于 SqlClient 數據提供程序時(并因此使用 SqlDatabase 類),下列代碼將與前面的代碼有著同樣的行為。然而,此代碼不能移植到其他的數據類型。

Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "GetProductDetails";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);db.AddInParameter(dbCommand, "@ProductID", DbType.Int32, 5);
db.AddOutParameter(dbCommand, "@ProductName", DbType.String, 50);
db.AddOutParameter(dbCommand, "@UnitPrice", DbType.Currency, 8);

使用列值做為參數輸入
UpdateDataSet 方法要求三個不同的命令:一個用于插入值,一個用于修改值,另一個用于刪除值。通常,這些命令用于存儲過程而不是 SQL 字符串。它們在調用后保持由存儲過程使用的參數。代替指定用于存儲過程參數的值,來自 DataSet 的值被用作輸入。在這種情況下,AddInParameter 的適當重載是接受源列做為參數的方法之一。
下列代碼展示了如何使用列值做為參數輸入。

Database db = DatabaseFactory.CreateDatabase();DbCommand insertCommand = db.GetStoredProcCommand("AddProduct");
db.AddInParameter(insertCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current);
db.AddInParameter(insertCommand, "CategoryID", DbType.Int32, "CategoryID", DataRowVersion.Current);
db.AddInParameter(insertCommand, "UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current);

?

參數發現
使用數據訪問應用程序塊,開發人員可以指定用于參數的值,而不需要關于這些參數的任何其他信息。在使用參數發現時,將要指定所有參數,并設置所有輸出參數為 NULL
下列代碼示范了如何僅通過指定參數值而無其他屬性來使用 GetStoredProcCommand

Database db = DatabaseFactory.CreateDatabase();
string sqlCommand = "UpdateProduct";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand, 11, "Queso Cabrales", 4, 25);


關于每個參數的信息(例如,它的數據類型)依賴是底層 ADO.NET 方法調用所需要的。為了提供這些信息,數據訪問應用程序塊使用 ADO.NET 中的 DeriveParameters 方法來查找參數信息。
因為 DeriveParameters 調用需要到后端數據庫的一次往返,應用程序塊還提供了參數信息緩存。在第一次調用需要參數發現的特定存儲過程后,關于每個參數的信息都保存到了參數緩存中。這意味著對同樣的存儲過程的后繼調用將不需要往返。
在使用參數發現時,最好的方法是指定所有的輸出參數為 NULL 。不需要為 Oracle 存儲過程提供游標參數,OracleDatabase 提供了它們。此對象假設游標參數是存儲過程參數列表中的第一個參數。

轉載于:https://www.cnblogs.com/sczw-maqing/p/3375806.html

總結

以上是生活随笔為你收集整理的Enterprise Library 4 数据访问应用程序块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。