Home  >  Article  >  Database  >  Enterprise Library2.0(1):Data Access Application Block学

Enterprise Library2.0(1):Data Access Application Block学

WBOY
WBOYOriginal
2016-06-07 15:42:46979browse

Data Access Application Block 提供了通用的数据访问的功能,随着 2.0 版本的推出有了很大变化。 一.改进 在 DAAB1.1 里面我们知道 Database 方法返回或者创建一个 DBCommandWrapper 对象,而在 DAAB2.0 里面移除了 DBCommandWrapper 类,用 ADO.NET2.0 里

Enterprise Library2.0(1):Data Access Application Block学

Data Access Application Block提供了通用的数据访问的功能,随着2.0版本的推出有了很大变化。

一.改进

DAAB1.1里面我们知道Database方法返回或者创建一个DBCommandWrapper对象,而在DAAB2.0里面移除了DBCommandWrapper类,用ADO.NET2.0里面的DBCommand类代替实现类似的功能,这样使得DAAB跟我们的.NET类库的结合更加紧密,回忆一下我们在1.1里面用DBCommandWrapper来访问数据时的代码:

Enterprise Library2.0(1):Data Access Application Block学Database db = DatabaseFactory.CreateDatabase();
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学DBCommandWrapper dbCommand 
= db.GetStoredProcCommandWrapper("GetProductsByCategory");
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学dbCommand.AddInParameter(
"CategoryID", DbType.Int32, Category);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学DataSet productDataSet 
= db.ExecuteDataSet(dbCommand);

而用了新的DBCommand类之后则变成了:

Enterprise Library2.0(1):Data Access Application Block学Database db = DatabaseFactory.CreateDatabase();
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学DbCommand dbCommand 
= db.GetStoredProcCommand("GetProductsByCategory"); 
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学db.AddInParameter(dbCommand, 
"CategoryID", DbType.Int32, Category);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学DataSet productDataSet 
= db.ExecuteDataSet(dbCommand);

数据库连接字符串在我们基于数据库的开发永远是少不了的,但是在DAAB1.1下,它所使用的字符串跟我们在.NET类库中使用的连接字符串却是不能共享的,它们分别保存在不同的位置。而在2.0Data Access Application Block使用了ADO.NET2.0里面配置区,这样带来的一个好处是连接字符串可以在Application Block和自定义的.NET类之间共享使用该配置区,如:

Enterprise Library2.0(1):Data Access Application Block学connectionStrings>
Enterprise Library2.0(1):Data Access Application Block学        
add
Enterprise Library2.0(1):Data Access Application Block学            
name="DataAccessQuickStart" 
Enterprise Library2.0(1):Data Access Application Block学            providerName
="System.Data.SqlClient"
Enterprise Library2.0(1):Data Access Application Block学            connectionString
="server=(local)\SQLEXPRESS;database=EntLibQuickStarts;Integrated Security=true" />
Enterprise Library2.0(1):Data Access Application Block学
connectionStrings>

.NET2.0下,泛型编程已经成为了一个核心,而2.0版的DAAB中也新增了一个GenericDatabase对象。DAAB中虽然已经包含了SqlDatabaseOrcaleDatabase,但是如果我们需要使用其他的像DB2等数据库时,就需要用到GenericDatabase,它可以用于任何.NET类库中的数据提供者,包括OdbcProviderOleDbProvider

二.使用示例

DAAB2.0的配置非常简单,主要有以下几方面的配置:

配置连接字符串

Enterprise Library2.0(1):Data Access Application Block学

配置默认数据库

Enterprise Library2.0(1):Data Access Application Block学

添加相关的命名空间:

Enterprise Library2.0(1):Data Access Application Block学using Microsoft.Practices.EnterpriseLibrary.Data;
Enterprise Library2.0(1):Data Access Application Block学
using System.Data;

使用Data Access Application Block进行数据的读取和操作,一般分为三步:

1.创建Database对象

2.提供命令参数,如果需要的话

3.执行命令

下面分别看一下DataAccessQuickStart中提供的一些例子:

执行静态的SQL语句

Enterprise Library2.0(1):Data Access Application Block学public string GetCustomerList()
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学
// 创建Database对象
Enterprise Library2.0(1):Data Access Application Block学
Database db = DatabaseFactory.CreateDatabase();
Enterprise Library2.0(1):Data Access Application Block学
// 使用SQL语句创建DbCommand对象
Enterprise Library2.0(1):Data Access Application Block学
string sqlCommand = "Select CustomerID, Name, Address, City, Country, PostalCode " +
Enterprise Library2.0(1):Data Access Application Block学    
"From Customers";
Enterprise Library2.0(1):Data Access Application Block学DbCommand dbCommand 
= db.GetSqlStringCommand(sqlCommand);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学StringBuilder readerData 
= new StringBuilder();
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学
// 调用ExecuteReader方法
Enterprise Library2.0(1):Data Access Application Block学
using (IDataReader dataReader = db.ExecuteReader(dbCommand))
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学    
while (dataReader.Read())
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学    
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学        
// Get the value of the 'Name' column in the DataReader
Enterprise Library2.0(1):Data Access Application Block学
        readerData.Append(dataReader["Name"]);
Enterprise Library2.0(1):Data Access Application Block学        readerData.Append(Environment.NewLine);
Enterprise Library2.0(1):Data Access Application Block学    }

Enterprise Library2.0(1):Data Access Application Block学}

Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学
return readerData.ToString();
Enterprise Library2.0(1):Data Access Application Block学}

执行存储过程并传递参数,返回DataSet

Enterprise Library2.0(1):Data Access Application Block学public DataSet GetProductsInCategory(int Category)
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学    
// Create the Database object, using the default database service. The
Enterprise Library2.0(1):Data Access Application Block学    
// default database service is determined through configuration.
Enterprise Library2.0(1):Data Access Application Block学
    Database db = DatabaseFactory.CreateDatabase();
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
string sqlCommand = "GetProductsByCategory";
Enterprise Library2.0(1):Data Access Application Block学    DbCommand dbCommand 
= db.GetStoredProcCommand(sqlCommand);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Retrieve products from the specified category.
Enterprise Library2.0(1):Data Access Application Block学
    db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, Category);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// DataSet that will hold the returned results        
Enterprise Library2.0(1):Data Access Application Block学
    DataSet productsDataSet = null;
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    productsDataSet 
= db.ExecuteDataSet(dbCommand);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Note: connection was closed by ExecuteDataSet method call 
Enterprise Library2.0(1):Data Access Application Block学

Enterprise Library2.0(1):Data Access Application Block学    
return productsDataSet;
Enterprise Library2.0(1):Data Access Application Block学}

利用DataSet更新数据

Enterprise Library2.0(1):Data Access Application Block学public int UpdateProducts()
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学    
// Create the Database object, using the default database service. The
Enterprise Library2.0(1):Data Access Application Block学    
// default database service is determined through configuration.
Enterprise Library2.0(1):Data Access Application Block学
    Database db = DatabaseFactory.CreateDatabase();
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    DataSet productsDataSet 
= new DataSet();
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
string sqlCommand = "Select ProductID, ProductName, CategoryID, UnitPrice, LastUpdate " +
Enterprise Library2.0(1):Data Access Application Block学        
"From Products";
Enterprise Library2.0(1):Data Access Application Block学    DbCommand dbCommand 
= db.GetSqlStringCommand(sqlCommand);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
string productsTable = "Products";
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Retrieve the initial data
Enterprise Library2.0(1):Data Access Application Block学
    db.LoadDataSet(dbCommand, productsDataSet, productsTable);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Get the table that will be modified
Enterprise Library2.0(1):Data Access Application Block学
    DataTable table = productsDataSet.Tables[productsTable];
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Add a new product to existing DataSet
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学
    DataRow addedRow = table.Rows.Add(new object[] Enterprise Library2.0(1):Data Access Application Block学{DBNull.Value, "New product"1125});
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Modify an existing product
Enterprise Library2.0(1):Data Access Application Block学
    table.Rows[0]["ProductName"= "Modified product";
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Establish our Insert, Delete, and Update commands
Enterprise Library2.0(1):Data Access Application Block学
    DbCommand insertCommand = db.GetStoredProcCommand("AddProduct");
Enterprise Library2.0(1):Data Access Application Block学    db.AddInParameter(insertCommand, 
"ProductName", DbType.String, "ProductName", DataRowVersion.Current);
Enterprise Library2.0(1):Data Access Application Block学    db.AddInParameter(insertCommand, 
"CategoryID", DbType.Int32, "CategoryID", DataRowVersion.Current);
Enterprise Library2.0(1):Data Access Application Block学    db.AddInParameter(insertCommand, 
"UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    DbCommand deleteCommand 
= db.GetStoredProcCommand("DeleteProduct");
Enterprise Library2.0(1):Data Access Application Block学    db.AddInParameter(deleteCommand, 
"ProductID", DbType.Int32, "ProductID", DataRowVersion.Current);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    DbCommand updateCommand 
= db.GetStoredProcCommand("UpdateProduct");
Enterprise Library2.0(1):Data Access Application Block学    db.AddInParameter(updateCommand, 
"ProductID", DbType.Int32, "ProductID", DataRowVersion.Current);
Enterprise Library2.0(1):Data Access Application Block学    db.AddInParameter(updateCommand, 
"ProductName", DbType.String, "ProductName", DataRowVersion.Current);
Enterprise Library2.0(1):Data Access Application Block学    db.AddInParameter(updateCommand, 
"LastUpdate", DbType.DateTime, "LastUpdate", DataRowVersion.Current);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Submit the DataSet, capturing the number of rows that were affected
Enterprise Library2.0(1):Data Access Application Block学
    int rowsAffected = db.UpdateDataSet(productsDataSet, "Products", insertCommand, updateCommand,
Enterprise Library2.0(1):Data Access Application Block学                                        deleteCommand, UpdateBehavior.Standard);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
return rowsAffected;
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学}

通过ID获取记录详细信息

Enterprise Library2.0(1):Data Access Application Block学public string GetProductDetails(int productID)
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学    
// Create the Database object, using the default database service. The
Enterprise Library2.0(1):Data Access Application Block学    
// default database service is determined through configuration.
Enterprise Library2.0(1):Data Access Application Block学
    Database db = DatabaseFactory.CreateDatabase();
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
string sqlCommand = "GetProductDetails";
Enterprise Library2.0(1):Data Access Application Block学    DbCommand dbCommand 
= db.GetStoredProcCommand(sqlCommand);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Add paramters
Enterprise Library2.0(1):Data Access Application Block学    
// Input parameters can specify the input value
Enterprise Library2.0(1):Data Access Application Block学
    db.AddInParameter(dbCommand, "ProductID", DbType.Int32, productID);
Enterprise Library2.0(1):Data Access Application Block学    
// Output parameters specify the size of the return data
Enterprise Library2.0(1):Data Access Application Block学
    db.AddOutParameter(dbCommand, "ProductName", DbType.String, 50);
Enterprise Library2.0(1):Data Access Application Block学    db.AddOutParameter(dbCommand, 
"UnitPrice", DbType.Currency, 8);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    db.ExecuteNonQuery(dbCommand);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Row of data is captured via output parameters
Enterprise Library2.0(1):Data Access Application Block学
    string results = string.Format(CultureInfo.CurrentCulture, "{0}, {1}, {2:C} ",
Enterprise Library2.0(1):Data Access Application Block学                                   db.GetParameterValue(dbCommand, 
"ProductID"),
Enterprise Library2.0(1):Data Access Application Block学                                   db.GetParameterValue(dbCommand, 
"ProductName"),
Enterprise Library2.0(1):Data Access Application Block学                                   db.GetParameterValue(dbCommand, 
"UnitPrice"));
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
return results;
Enterprise Library2.0(1):Data Access Application Block学}

XML格式返回数据

Enterprise Library2.0(1):Data Access Application Block学public string GetProductList()
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学    
// Use a named database instance that refers to a SQL Server database.
Enterprise Library2.0(1):Data Access Application Block学
    SqlDatabase dbSQL = DatabaseFactory.CreateDatabase() as SqlDatabase;
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
// Use "FOR XML AUTO" to have SQL return XML data
Enterprise Library2.0(1):Data Access Application Block学
    string sqlCommand = "Select ProductID, ProductName, CategoryID, UnitPrice, LastUpdate " +
Enterprise Library2.0(1):Data Access Application Block学        
"From Products FOR XML AUTO";
Enterprise Library2.0(1):Data Access Application Block学    DbCommand dbCommand 
= dbSQL.GetSqlStringCommand(sqlCommand);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    XmlReader productsReader 
= null;
Enterprise Library2.0(1):Data Access Application Block学    StringBuilder productList 
= new StringBuilder();
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学    
try
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学    
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学        productsReader 
= dbSQL.ExecuteXmlReader(dbCommand);
Enterprise Library2.0(1):Data Access Application Block学
Enterprise Library2.0(1):Data Access Application Block学        
// Iterate through the XmlReader and put the data into our results.
Enterprise Library2.0(1):Data Access Application Block学
        while (!productsReader.EOF)
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学        
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学            
if (productsReader.IsStartElement())
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学            
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学                productList.Append(productsReader.ReadOuterXml());
Enterprise Library2.0(1):Data Access Application Block学                productList.Append(Environment.NewLine);
Enterprise Library2.0(1):Data Access Application Block学            }

Enterprise Library2.0(1):Data Access Application Block学        }

Enterprise Library2.0(1):Data Access Application Block学    }

Enterprise Library2.0(1):Data Access Application Block学    
finally
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学    
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学      
// Close the Reader.
Enterprise Library2.0(1):Data Access Application Block学
      if (productsReader != null)
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学      
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学          productsReader.Close();
Enterprise Library2.0(1):Data Access Application Block学      }

Enterprise Library2.0(1):Data Access Application Block学      
Enterprise Library2.0(1):Data Access Application Block学      
// Explicitly close the connection. The connection is not closed
Enterprise Library2.0(1):Data Access Application Block学      
// when the XmlReader is closed.
Enterprise Library2.0(1):Data Access Application Block学
      if (dbCommand.Connection != null)
Enterprise Library2.0(1):Data Access Application Block学Enterprise Library2.0(1):Data Access Application Block学      
Enterprise Library2.0(1):Data Access Application Block学{
Enterprise Library2.0(1):Data Access Application Block学        dbCommand.Connection.Close();
Enterprise Library2.0(1):Data Access Application Block学

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn