20080207 Data Access Application Block
http://www.yippeesoft.com

Data Access Application Block 将访问 Microsoft SQL Server? 数据库的性能和资源治理方面的最佳经验封装在一起。您可以很方便地在自己的 .NET 应用程序中将其作为构造块使用,从页减少了需要创建、测试和维护的自定义代码的数量。
  
  尤其是,Data Access Application Block 可以帮助您:
  
  调用存储过程或 SQL 文本命令。
  指定参数具体信息。
  返回 SqlDataReader、DataSet 或 XMLReader 对象。
  例如,在引用了 Data Access Application Block 的应用程序中,您可以简单地在一行代码中调用存储过程并生成 DataSet

SqlHelper 类提供了五种 Shared (Visual Basic) 或 static (C#) 方法,它们是:ExecuteNonQuery、ExecuteDataset、ExecuteReader、ExecuteScalar 和 ExecuteXmlReader。实现的每种方法都提供一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此开发人员可以确定传递连接、事务和参数信息的方式。

data access application block 是一个 .net 组件,包含优化的数据访问代码,可以帮助用户调用存储过程以及向 sql server 数据库发出 sql 文本命令。它返回 sqldatareader、dataset 和 xmlreader 对象。您可以在自己的 .net 应用程序中将其作为构造块来使用,以减少需要创建、测试和维护的自定义代码的数量。

http://www.microsoft.com/taiwan/msdn/library/2004/May-2004/wriportap2.htm
當 ADO 進入 MDAC (Microsoft Data Access Component 2.1 版) 的成熟期時,Microsoft 推出了「通用資料存取」活動。這個構想是要向開發人員展示單純利用一個簡單的物件模型 (Connection、Command 和 Recordset),他們就可以撰寫一個能與各種不同的資料來源相連接的應用程式,包括關聯性和非關聯性的形式。當時的說明文件 — 以及絕大多數的文章和範例 — 都忘了說明即使是使用相同的資料存取技術,不同的資料來源彼此的程式設計性和特性是大不相同。

最後的結果是如果應用程式需要數個來源的資料,最簡單的方法是使用所有資料來源所提供的功能「共同要素」,不過這就失去了使用可提供最佳化方法存取和操作不同 RDBMS 內的資訊的資料來源特定選項所帶來的效益。

常讓我對此方法質疑的是,經過我與客戶一番更詳細的分析之後,我們通常同意應用程式中與資料來源互動的部份,在與其餘的展示和商業邏輯比較起來,相當地小。藉由做好模組化設計,就有可能可以將 RDBMS 特定的程式碼隔離到一些可輕鬆互換的模組內,藉此避免「大小通吃」的方法存取我們的資料。我們可以改用相當特定的資料存取程式碼 (使用預存程序、指令批次和其他功能,視資料來源而定),而不需要碰到絕大部份其他應用程式程式碼。這有助於提醒正確的設計是撰寫可移植及有效程式碼的關鍵。

ADO.NET 將一些重要的變更帶入了資料存取的編碼競技場,就像專門化 .NET 資料提供者的概念一樣。使用特定的提供者,您就有最佳化的方法可到達資料來源,規避介入資料存取程式碼和資料庫伺服器之間一連串 OLE 和 ODBC 層「非常」豐富但有時候不必要的軟體介面和服務。然而,每個資料來源還是有不同的特性和功能、有不同的 SQL 對話,而且若要撰寫有效的應用程式,您還是必須使用這些特定的特性來取代「共同要素」。從可移植的觀點看來,Managed 和 Unmanaged 資料存取技術仍相當類似。

http://blog.163.com/han_xiao_f/blog/static/42077781200671994225665/
Enterprise Library: Data Access Application Block使用向导,Part 1
Data Access ApplicationBlock有如下好处:

l        减少编写重复累赘代码去执行标准的任务。

l        帮助在应用程序内部和跨企业应用维护一致的数据访问实践。

l        降低改变物理数据目标的难度。

l        减轻开发人员学习不同数据库类型的不同编程模型。

l        当移植应用程序到不同数据库类型时,减少重写代码的数量。

 

Data Access ApplicationBlock依赖项:

l        Data AccessApplication Block依赖其他的applicationblocks和EnterpriseLibrary中的代码。

l        ConfigurationApplication Block – Data Access ApplicationBlock使用该Configuration ApplicationBlock读取配置信息。

l        Common类库功能,如instrumentation –提供不同功能用来显示事件和系统管理的数据。

l        此外,applicationblock使用XML文件存放配置信息,推荐采用EntepriseLibrary配置工具来修改这些配置信息。

选择合适的重载方法

每一个数据访问方法均有许多重载,如下的描述和指导帮助你选择合适的重载:

l        一些重载方法接受DBCommandWrapper对象,DBCommandWrapper在一个对象内同时封装了command和参数。允许你同时增加输入/输出参数和设置这些参数的类型。这些重载提供了很好的灵活性和对每一个方法的控制。

l        一些重载方法接受存储过程和存储过程参数集合,当调用仅有输入参数的存储过程时,调用这些重载比较方便。

l        一些重载方法接受System.Data.CommandType和字符串命令,当执行在线的SQL语句或没有参数的存储过程时,调用这些重载比较方便。

l        最后,上述的每一个重载都包含一个接受事务的重载方法,当在现有事务内执行方法时,允许你使用合适的重载类型

Data Access Application Block 翻译

Data Access Application Block 附带的文档 挑一些翻译出来 以后自己看 有不当的地方  高手请给与指教
一:引用Data Access Application Block
   1.在解决方案中,单击项目添加对Microsoft.ApplicationBlocks.Data.dll的引用
   2.添加
     using System.Data.SqlClient;
     using Microsoft.ApplicationBlocks.Data;
     using System.Xml;
二 :用SqlDataReader 得到多个rows
    1.用如下的重载方法调用带参数的存储过程
public static SqlDataReader ExecuteReader(string connectionString,CommandType commandType,string commandText,params SqlParameter[] commandParameters)
   2.下面的代码片断向您展示了SqlHelper类如何获得一个SqlDataReader 对象。在获得这个对象之后,可以将它绑定到用户控件上

       

private SqlDataReader RetrieveDataReader(string connectionString, int categoryID)

&leftsign;                         

  // 调用SqlHelper class 的静态方法ExecuteReader ,从而得到一个SqlDataReader
// 我们传递数据库连接字符串, 存储过程名字和参数categoryID 的值  SqlDataReader reader = SqlHelper.ExecuteReader(connectionString, "getProductsByCategory",  categoryID);

  return reader;                 

&rightsign;

http://www.cnblogs.com/rickie/archive/2005/02/06/102656.html
Data Access Application Block使用向导:

1.增加对Microsoft.Practices.EnterpriseLibrary.Data.dll和Microsoft.Practices.EnterpriseLibrary.Configuration.dll的引用,并在代码在添加:

using Microsoft.Practices.EnterpriseLibrary.Data;

 

2.调用代码示例:

(1) ExecuteDataSet方法

Database db = DatabaseFactory.CreateDatabase();

DataSet dsCustomers = db.ExecuteDataSet(CommandType.Text, "Select * From Customers" );

customerGrid.DataSource = dsCustomers.Tables[0];

 

(2) ExecuteReader方法

Database db = DatabaseFactory.CreateDatabase();

 

string sqlCommand = "Select top 5 * From Customers";

DBCommandWrapper dbCommandWrapper = db.GetSqlStringCommandWrapper(sqlCommand);

 

StringBuilder readerData = new StringBuilder();

 

using (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))

&leftsign;

while (dataReader.Read())

&leftsign;

readerData.Append(dataReader["ContactName"]);

readerData.Append(Environment.NewLine);

&rightsign;

&rightsign;

 

txtResult.Text = readerData.ToString();

为了执行SQL语句,上述代码使用GetSqlStringCommandWrapper方法创建合适command wrapper对象,然后作为参数传递给ExecuteReader方法。

 

(3) ExecuteNonQuery方法

Database db = DatabaseFactory.CreateDatabase();

 

string sqlCommand = "getProductDetails";

DBCommandWrapper dbCommandWrapper = db.GetStoredProcCommandWrapper(sqlCommand);

 

// Add paramters

int productID=1;

// Input parameters can specify the input value

dbCommandWrapper.AddInParameter("@ProductID", DbType.Int32, productID);

// Output parameters specify the size of the return data

dbCommandWrapper.AddOutParameter("@ProductName", DbType.String, 40);

dbCommandWrapper.AddOutParameter("@UnitPrice", DbType.Currency, 8);

dbCommandWrapper.AddOutParameter("@QtyPerUnit", DbType.String, 20);

 

db.ExecuteNonQuery(dbCommandWrapper);

 

// Row of data is captured via output parameters

string results = string.Format(CultureInfo.CurrentCulture, "&leftsign;0&rightsign;, &leftsign;1&rightsign;, &leftsign;2:C&rightsign;, &leftsign;3&rightsign; ",

      dbCommandWrapper.GetParameterValue("@ProductID"),

      dbCommandWrapper.GetParameterValue("@ProductName"),

      dbCommandWrapper.GetParameterValue("@UnitPrice"),

      dbCommandWrapper.GetParameterValue("@QtyPerUnit"));

 

txtResult.Text = results;

为了执行存储过程,上述代码使用GetStoredProcCommandWrapper方法创建合适的command wrapper对象,然后作为参数传递给ExecuteNonQuery方法。

 

(4) ExecuteScalar方法

Database db = DatabaseFactory.CreateDatabase();

 

string sqlCommand = "GetProductName";

int productID=1;

DBCommandWrapper dbCommandWrapper = db.GetStoredProcCommandWrapper(sqlCommand, productID);

 

// Retrieve ProdcutName. ExecuteScalar returns an object, so

// we cast to the correct type (string).

string productName = (string) db.ExecuteScalar(dbCommandWrapper);

 

txtResult.Text = productName;

 

Demo程序界面如下(注意在项目属性窗口中设置Post-build Event Command Line属性值:copy "$(ProjectDir)*.config" "$(TargetDir)"):

 

***

作者:Rickie Lee (rickieleemail#yahoo.com)

本文参考Enterprise Library: Data Access Application Block Quick Start范例,简单编写一个DEMO。

 

References:

1. Enterprise Library: Data Access Application Block Quick Start

2. Rickie, Microsoft patterns & practices Enterprise Library January 2005 [中文稿], http://www.cnblogs.com/rickie/archive/2005/01/30/99443.html

3. Rickie, Enterprise Library released! http://www.cnblogs.com/rickie/archive/2005/01/29/99106.html

历史博文

标签:, ,
十一月 9, 2008 at 5:05 下午 by yippee 1,018 次
Category: Info
Tags: , ,