注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

Enterprise Library 2.0 -- Data Access Application Block  

2011-10-20 22:52:28|  分类: asp.net |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前面介绍了Enterprise Library 2.0 中的Caching Application Block 和 Cryptography Application Block,今天我们来看一下Enterprise Library 2.0里对数据处理的部分--Data Access Application Block。它为我们开发者提供了对数据处理的大部分通用的方法。其内容包括:
1、使用DataReader返回多行数据
2、使用DataSet返回多行数据
3、返回一个输出型参数
4、返回一个单一值
5、事务处理
6、返回XML数据
7、使用DataSet来修改数据库
8、Enterprise Library 2.0 -- Data Access Application Block (补充)
...
看 起来DataAccess Application Block很像是ADO.NET,确实如此,DataAccess Application Block 不是ADO.NET的替代品,它是对ADO.NET的补充。DataAccess Application Block的优点在于它可以使用相同的代码去访问不同类型的数据库,比如我们的应用程序从Sql Server上转到Oracle,那么使用DataAccess Application Block 可以让你不需要修改任何代码而达到上述功能,不过配置文件是当然要修改的。当然也不是在任何情况下都要用DataAccess Application Block,例如,当我们的代码是为了一种很特殊的数据库而编写的话,这时候应该选用ADO.NET。

   首先我们来看一下DataAccess Application Block 是如何配置的(以Sql Server 2000为例)。
首先打开Enterprise Library提供的配置工具,选择File-->Open Application,选中我们项目种的Web.Config或App.Config文件:
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客

修改DataBase名称为我们需要连接的数据库名称:
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客

修改Server,指定数据库服务器名:
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客

再添加两个参数,分别是uid和pwd:
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客

最后点 File-->Save All,这样就完成了一个数据库的配置。生成的配置文件内容如下:

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客<?xml version="1.0" encoding="utf-8"?>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
<configuration>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客  
<configSections>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客    
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客  
</configSections>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客  
<dataConfiguration defaultDatabase="Connection String" />
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客  
<connectionStrings>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客    
<add name="Connection String" connectionString="Database=EnterpriseLibrary;Server=shy;Integrated Security=SSPI;uid=sa;pwd=;"
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客      providerName
="System.Data.SqlClient" />
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客  
</connectionStrings>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
</configuration>

在其中的ConnectionStrings节里我们可以看到我们刚刚配置时输入的数据库信息。

       下面我们重点来说一下DataAccess Application Block操作数据库的方法。
1、创建一个数据库实例DataBase

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        //创建一个默认的数据库实例
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            Database defaultdb = DatabaseFactory.CreateDatabase();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//创建一个名为Connection String的数据库实例
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            Database db = DatabaseFactory.CreateDatabase("Connection String");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//上面两种创建数据库实例的方法的数据库可以是任何类型的数据库,取决于Config文件中的配置信息
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//下面的这种方面展示了创建一个SQL数据库的实例,需引用Microsoft.Practices.EnterpriseLibrary.Data.Sql程序集
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            SqlDatabase dbsql = DatabaseFactory.CreateDatabase("Connection String"as SqlDatabase;
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//我们同样也可以不通过配置文件来创建数据库实例,如下
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            string connString = "server=.;database=EnterpriseLibrary;uid=sa;pwd=";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            SqlDatabase nocofigdb 
= new SqlDatabase(connString);

2、创建DbCommand
      DbCommand的创建方式有两种:一种是为了调用存储过程创建,一种是为了执行一般的SQL语句而创建,具体用哪一种方式,就要看你需要执行的是存储过程还是SQL语句了。

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        //创建一个SQL语句的DbCommand
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            Database db = DatabaseFactory.CreateDatabase();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
string sql = "Select * from person";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand Sqldbcomm 
= db.GetSqlStringCommand(sql);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//创建一个存储过程的DbCommand
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//存储过程名称为GetAllPersonByName
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            string procName = "GetAllPersonByName";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand Procdbcomm 
= db.GetStoredProcCommand(procName);

3、存储过程中的参数处理
DataBase类中包含多种传递存储过程参数的方法,也包含了得到和设置参数值的方法,如下:
AddParameter. 为存储过程传递一个参数(输入型或输出型)
AddInParameter. 为存储过程传递一个输入型参数
AddOutParameter. 为存储过程传递一个输出型参数
GetParameterValue. 获取某存储过程指定参数的值
SetParameterValue. 为存储过程的某个参数赋值,当你需要用同一个方法来执行插入多条记录时,就可参数给参数赋值的方法来进行

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客//创建一个存储过程的DbCommand
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//存储过程名称为GetAllPersonByName
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            string procName = "GetAllPersonByName";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand Procdbcomm 
= db.GetStoredProcCommand(procName);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//添加一个输入型的参数
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            db.AddInParameter(Procdbcomm, "@sex", DbType.String);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//添加一个输出型的参数
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            db.AddOutParameter(Procdbcomm, "@name", DbType.String,20);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//设置参数的值
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            db.SetParameterValue(Procdbcomm, "@sex""");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//执行存储过程
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            db.ExecuteNonQuery(Procdbcomm);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//得到输出参数的值,注意转化返回值类型
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            string outvalue = (string) db.GetParameterValue(Procdbcomm, "@name");

4、执行ExecuteReader方法返回一个IDataReader类型的数据集

       因为ExecuteReader方法在一开始执行时就打开了一个与数据库的连接,所以我们必须注意在使用结束时关闭连接,而用using(){}语句块就能确保ExecuteReader方法在执行完毕时关闭与数据库的连接。
       什么时候使用此方法:
 返回的数据仅仅用来显示,并不对其进行修改,删除等操作;  
 绑定返回的数据到WebForm Control
 不需要缓存返回的数据,用完就释放

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        using (IDataReader reader = db.ExecuteReader(CommandType.Text, "select * from person"))
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                DataGrid1.DataSource 
= reader;
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                DataGrid1.DataBind();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            }

5、执行ExecuteDataSet方法返回一个DataSet
    

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客public DataSet GetPersonList()
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            Database db 
= DatabaseFactory.CreateDatabase();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand dbcomm 
= db.GetSqlStringCommand("select * from person");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
return db.ExecuteDataSet(dbcomm);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }

什么时候使用此方法:
    需要返回多表数据;
    如果你需要逐一访问数据库的每一条记录,这个时候如果使用DataReader的话,则会使与数据库的连接一直处于打开的状态,长此以往,就会使应用程序的性能和可伸缩性大大降低;
    需要和其他的应用程序交换数据;

6、执行ExecuteNonQuery
   该方法返回的是SQL语句执行影响的行数,我们可以利用该方法来执行一些没有返回值的操作(Insert,Update,Delete)

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客    public void AddPerson()
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            Database db 
= DatabaseFactory.CreateDatabase();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand dbcomm 
= db.GetSqlStringCommand("insert into person values(1,'shy','女','123456')");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            db.ExecuteNonQuery(dbcomm);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }

7、执行ExecuteScalar返回单值

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客    public string GetPersonName()
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            Database db 
= DatabaseFactory.CreateDatabase();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand dbcomm 
= db.GetSqlStringCommand("select name from person");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
return (string)db.ExecuteScalar(dbcomm);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }

8、事务处理

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客     public void UseTransaction()
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            Database db 
= DatabaseFactory.CreateDatabase();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand dbcomm1 
= db.GetSqlStringCommand("update person set name='pw'");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand dbcomm2 
= db.GetSqlStringCommand("delete from person where id=1");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
using (DbConnection conn = db.CreateConnection())
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
//打开连接
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
                conn.Open();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
//创建事务
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
                DbTransaction trans = conn.BeginTransaction();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
try
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    db.ExecuteNonQuery(dbcomm1);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    db.ExecuteNonQuery(dbcomm2);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    
//都执行成功则提交事务
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
                    trans.Commit();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
catch(Exception)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    
//发生异常,事务回滚
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
                    trans.Rollback();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
//关闭连接
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
                conn.Close();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }

9、执行ExecuteXmlReader返回XML数据
   支持Sql Server 2000 及以后版本的数据库,对微软以外的数据库应该不支持。

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客    public void UseXMLReader()
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            SqlDatabase dbSQL 
= DatabaseFactory.CreateDatabase("Connection String"as SqlDatabase;
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
// 要返回XML数据需要在SQL语句后加 FOR XML AUTO
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            string sqlCommand = "SELECT ProductID, ProductName FROM Products FOR XML AUTO";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand dbCommand 
= dbSQL.GetSqlStringCommand(sqlCommand);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            XmlReader personReader 
= null;
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            StringBuilder personlist 
= new StringBuilder();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
try
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                personReader 
= dbSQL.ExecuteXmlReader(dbCommand);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
// 循环向XML中写入我们查询得到的数据
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
                while (!personReader.EOF)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    
if (personReader.IsStartElement())
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                        personlist.Append(personReader.ReadOuterXml());
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                        personlist.Append(Environment.NewLine);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
finally
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
// 关闭 Reader.
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
                if (personReader != null)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    personReader.Close();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
// 关闭数据库连接
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
                if (dbCommand.Connection != null)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                    dbCommand.Connection.Close();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }

10、用DataSet批量的添加,修改,删除数据

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客public void UpdateDataBase()
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            Database db 
= DatabaseFactory.CreateDatabase();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DataSet personDataSet 
= new DataSet();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
string sqlCommand = "Select * from person";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand dbCommand 
= db.GetSqlStringCommand(sqlCommand);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
string personTable = "person";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
// 得到初始化数据
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            db.LoadDataSet(dbCommand, personDataSet, personTable);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
// 得到未修改前的数据集
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            DataTable table = personDataSet.Tables[personTable];
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
// 往DataSet中添加一行数据
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            DataRow addedRow = table.Rows.Add(new object[] 18"New person""""654321" });
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
// 修改
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            table.Rows[0]["ProductName"= "Modified product";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
// 下面分别创建添加,修改,删除的操作
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            DbCommand insertCommand = db.GetStoredProcCommand("AddPerson");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            db.AddInParameter(insertCommand, 
"Name", DbType.String, "Name", DataRowVersion.Current);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            db.AddInParameter(insertCommand, 
"Sex", DbType.String, "Sex", DataRowVersion.Current);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            db.AddInParameter(insertCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand deleteCommand 
= db.GetStoredProcCommand("DeletePerson");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            db.AddInParameter(deleteCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DbCommand updateCommand 
= db.GetStoredProcCommand("UpdatePerson");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            db.AddInParameter(updateCommand, 
"Name", DbType.String, "Name", DataRowVersion.Current);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            db.AddInParameter(updateCommand, 
"Sex", DbType.String, "Sex", DataRowVersion.Current);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            db.AddInParameter(insertCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
// 提交对DataSet的修改,并返回影响的行数
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            int rowsAffected = db.UpdateDataSet(productsDataSet, "Products", insertCommand, updateCommand, deleteCommand, Microsoft.Practices.EnterpriseLibrary.Data.UpdateBehavior.Standard);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }

关于DataAccess Application Block 的配置以及使用先介绍到此,更深入的部分,我会在以后的文章里继续写的,也许你想知道2.0和1.0的区别,那么请参考我前面写的一篇1.0的数据访问程序块的介绍吧!

Enterprise Library1.0 -- DataAccess Application Block

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  前几天一位热心的朋友询问如何在DataAccess Application Block中将参数单独写成一个方法,以方便频繁调用一些存储过程,也可以将这些参数装入缓存以提高程序执行效率,下面将实现该功能的代码贴出来,希望对 正在研究这方面知识的朋友有所帮助.

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        /// <summary>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// 该方法用于返回一个存储过程的参数数组
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// 从而方便了我们在程序中反复调用
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// 而且我们可以将返回的参数数组装入缓存,提高程序执行效率
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// </summary>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// <param name="db">数据库连接</param>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// <param name="spName">存储过程名称</param>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// <returns>返回参数数组</returns>

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        public DbParameter[] GetDBCommandParameters(Database db , string spName)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//建立一个存储过程的DBCommand
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            DbCommand dbcomm = db.GetStoredProcCommand(spName);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//根据字面意思可以看到执行该方法是发现DBCommand的参数,即得到该DBCommand的参数
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            db.DiscoverParameters(dbcomm);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//测试了一下,不管存储过程有没有返回值,在这个参数数组的0位置都是一个@return_value参数,奇怪,将其移出
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            dbcomm.Parameters.RemoveAt(0);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//定义一个新的参数数组,并将DBCommand中的参数复制到该数组中
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            DbParameter[] result = new DbParameter[dbcomm.Parameters.Count];
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            dbcomm.Parameters.CopyTo(result,
0);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//将参数的初值设为空
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            foreach (DbParameter dp in result)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                dp.Value 
= DBNull.Value;
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
return result;
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客

然后我们在写一个给参数数组赋值的方法,如下:

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        /// <summary>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// 对参数数组赋值
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// </summary>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// <param name="commandParameters">参数数组</param>
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
/// <param name="parameterValues">对应值数组</param>

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        public void AssignParameters(DbParameter[] commandParameters, object[] parameterValues)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
if ((commandParameters == null|| (parameterValues == null))
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
return;
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
if (commandParameters.Length != parameterValues.Length)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                
throw new ArgumentException("参数数组长度不匹配!");
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
for (int i = 0, j = commandParameters.Length; i < j; i++)
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客                commandParameters[i].Value 
= parameterValues[i];
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客

然后我们就可以在程序中按照如下方法调用存储过程了:

Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        [TestMethod]
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
public void SelectPersonBySex()
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        
{
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
string sex = "";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//创建默认的数据库实例
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            Database db = DatabaseFactory.CreateDatabase();
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
string spName = "SelectPersonBySex";
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//DbCommand dbcomm = db.GetStoredProcCommand(spName);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//得到该存储过程的参数数组
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            DbParameter[] parameters = this.GetDBCommandParameters(db, spName);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
object[] strValues = new object[] { sex };
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            
//对参数数组赋值
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
            this.AssignParameters(parameters, strValues);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            DataSet ds 
= db.ExecuteDataSet(spName, parameters);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客            Assert.AreEqual(ds.Tables[
0].Rows.Count,1);
Enterprise Library 2.0 -- Data Access Application Block - 海里的贝壳 - apple的博客        }
转载:http://www.cnblogs.com/pw/archive/2006/06/12/424131.html
  评论这张
 
阅读(1053)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017