namespace BLL
{
public class Customers
{
public DataTable GetAllCustomers()
{
CustomersData cd = new CustomersData();
DataTable dt = cd.GetCustomers();
return dt;
}
public DataSet GetCustomerOrders()
{
// 待定
return null;
}
}
}
這樣看來,此方法出現什么問題了?此處的問題是,只有一個重要細節將代碼綁定到特定數據源:命令字符串的 SQL 語法!實際上,如果以這種方式編寫應用程序,則使其具有可移植性的唯一辦法是采用可以由任何數據源解釋的基本 SQL 語法,但這樣可能會失去從特定數據源的特定功能獲得好處的機會。如果應用程序只對數據進行很簡單和很標準的操作,并且如果您不希望使用特定數據源中的高級功能(如 XML 支持),這可能是個小問題。但通常此方法將導致性能降低,因為您無法使用每個數據源的最佳特性。
編寫專門的數據訪問層
因此,只使用基本接口不足以通過不同數據源提供可接受級別的抽象。這種情況下,一個好的解決方案是提高此抽象的級別,即創建一組類(如 Customer、Order 等)來封裝特定數據提供程序的使用,并通過與特定數據源、類型化的“數據集”、對象集合等無關的數據結構與應用程序的其他級別交換信息。
可以在特定程序集內部創建此層的專用類(為每個受支持的數據源分別創建一個專用類),并可以在需要的情況下按照配置文件中的說明從應用程序加載它們。這樣,如果您希望向應用程序中添加全新的數據源,唯一要做的事情是針對一組通用接口組中定義的“合同”實現一組新類。
讓我們看一個實際例子:如果希望將 Microsoft® SQL Server™ 和 Microsoft® Access 作為數據源為其提供支持,則應該在 Microsoft® Visual Studio® .NET 中創建兩個不同項目,每個數據源分別創建一個。
為 SQL Server 創建的項目將類似于如下所示:
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Configuration;
using Common;
namespace DAL
{
public class CustomersData : IDbCustomers
{
public DataTable GetCustomers()
{
string ConnectionString =
ConfigurationSettings.AppSettings
["ConnectionString"];
using (SqlConnection cnn = new SqlConnection
(ConnectionString))
{
string cmdString = "SELECT CustomerID," +
文章來源于領測軟件測試網 http://www.kjueaiud.com/