Enterprise Library 2.0 -- Data Access Application Block

        前面介绍了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文件:


修改DataBase名称为我们需要连接的数据库名称:


修改Server,指定数据库服务器名:


再添加两个参数,分别是uid和pwd:


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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  
<configSections>
    
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
  
</configSections>
  
<dataConfiguration defaultDatabase="Connection String" />
  
<connectionStrings>
    
<add name="Connection String" connectionString="Database=EnterpriseLibrary;Server=shy;Integrated Security=SSPI;uid=sa;pwd=;"
      providerName
="System.Data.SqlClient" />
  
</connectionStrings>
</configuration>

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

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

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

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

        //创建一个SQL语句的DbCommand
            Database db = DatabaseFactory.CreateDatabase();
            
string sql = "Select * from person";
            DbCommand Sqldbcomm 
= db.GetSqlStringCommand(sql);
            
//创建一个存储过程的DbCommand
            
//存储过程名称为GetAllPersonByName
            string procName = "GetAllPersonByName";
            DbCommand Procdbcomm 
= db.GetStoredProcCommand(procName);

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

//创建一个存储过程的DbCommand
            
//存储过程名称为GetAllPersonByName
            string procName = "GetAllPersonByName";
            DbCommand Procdbcomm 
= db.GetStoredProcCommand(procName);

            
//添加一个输入型的参数
            db.AddInParameter(Procdbcomm, "@sex", DbType.String);
            
//添加一个输出型的参数
            db.AddOutParameter(Procdbcomm, "@name", DbType.String,20);
            
//设置参数的值
            db.SetParameterValue(Procdbcomm, "@sex""");

            
//执行存储过程
            db.ExecuteNonQuery(Procdbcomm);

            
//得到输出参数的值,注意转化返回值类型
            string outvalue = (string) db.GetParameterValue(Procdbcomm, "@name");

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

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

        using (IDataReader reader = db.ExecuteReader(CommandType.Text, "select * from person"))
            
{
                DataGrid1.DataSource 
= reader;
                DataGrid1.DataBind();
            }

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

public DataSet GetPersonList()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();
            DbCommand dbcomm 
= db.GetSqlStringCommand("select * from person");

            
return db.ExecuteDataSet(dbcomm);
        }

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

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

    public void AddPerson()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();
            DbCommand dbcomm 
= db.GetSqlStringCommand("insert into person values(1,'shy','女','123456')");

            db.ExecuteNonQuery(dbcomm);
        }

7、执行ExecuteScalar返回单值

    public string GetPersonName()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();
            DbCommand dbcomm 
= db.GetSqlStringCommand("select name from person");

            
return (string)db.ExecuteScalar(dbcomm);
        }

8、事务处理

     public void UseTransaction()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();
            DbCommand dbcomm1 
= db.GetSqlStringCommand("update person set name='pw'");
            DbCommand dbcomm2 
= db.GetSqlStringCommand("delete from person where id=1");

            
using (DbConnection conn = db.CreateConnection())
            
{
                
//打开连接
                conn.Open();
                
//创建事务
                DbTransaction trans = conn.BeginTransaction();

                
try
                
{
                    db.ExecuteNonQuery(dbcomm1);

                    db.ExecuteNonQuery(dbcomm2);

                    
//都执行成功则提交事务
                    trans.Commit();
                }

                
catch(Exception)
                
{
                    
//发生异常,事务回滚
                    trans.Rollback();
                }

                
//关闭连接
                conn.Close();
            }

        }

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

    public void UseXMLReader()
        
{
            SqlDatabase dbSQL 
= DatabaseFactory.CreateDatabase("Connection String"as SqlDatabase;

            
// 要返回XML数据需要在SQL语句后加 FOR XML AUTO
            string sqlCommand = "SELECT ProductID, ProductName FROM Products FOR XML AUTO";
            DbCommand dbCommand 
= dbSQL.GetSqlStringCommand(sqlCommand);

            XmlReader personReader 
= null;
            StringBuilder personlist 
= new StringBuilder();

            
try
            
{
                personReader 
= dbSQL.ExecuteXmlReader(dbCommand);

                
// 循环向XML中写入我们查询得到的数据
                while (!personReader.EOF)
                
{
                    
if (personReader.IsStartElement())
                    
{
                        personlist.Append(personReader.ReadOuterXml());
                        personlist.Append(Environment.NewLine);
                    }

                }

            }

            
finally
            
{
                
// 关闭 Reader.
                if (personReader != null)
                
{
                    personReader.Close();
                }


                
// 关闭数据库连接
                if (dbCommand.Connection != null)
                
{
                    dbCommand.Connection.Close();
                }

            }



        }

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

public void UpdateDataBase()
        
{
            Database db 
= DatabaseFactory.CreateDatabase();

            DataSet personDataSet 
= new DataSet();

            
string sqlCommand = "Select * from person";
            DbCommand dbCommand 
= db.GetSqlStringCommand(sqlCommand);

            
string personTable = "person";

            
// 得到初始化数据
            db.LoadDataSet(dbCommand, personDataSet, personTable);

            
// 得到未修改前的数据集
            DataTable table = personDataSet.Tables[personTable];

            
// 往DataSet中添加一行数据
            DataRow addedRow = table.Rows.Add(new object[] 18"New person""""654321" });

            
// 修改
            table.Rows[0]["ProductName"= "Modified product";

            
// 下面分别创建添加,修改,删除的操作
            DbCommand insertCommand = db.GetStoredProcCommand("AddPerson");
            db.AddInParameter(insertCommand, 
"Name", DbType.String, "Name", DataRowVersion.Current);
            db.AddInParameter(insertCommand, 
"Sex", DbType.String, "Sex", DataRowVersion.Current);
            db.AddInParameter(insertCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);

            DbCommand deleteCommand 
= db.GetStoredProcCommand("DeletePerson");
            db.AddInParameter(deleteCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);

            DbCommand updateCommand 
= db.GetStoredProcCommand("UpdatePerson");
            db.AddInParameter(updateCommand, 
"Name", DbType.String, "Name", DataRowVersion.Current);
            db.AddInParameter(updateCommand, 
"Sex", DbType.String, "Sex", DataRowVersion.Current);
            db.AddInParameter(insertCommand, 
"ID", DbType.Int32, "ID", DataRowVersion.Current);

            
// 提交对DataSet的修改,并返回影响的行数
            int rowsAffected = db.UpdateDataSet(productsDataSet, "Products", insertCommand, updateCommand, deleteCommand, Microsoft.Practices.EnterpriseLibrary.Data.UpdateBehavior.Standard);
        }

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

Enterprise Library1.0 -- DataAccess Application Block

学习Enterprise Library 2.0的朋友多给点意见,谢谢!

Email:pwei013@163.com

posted on 2006-06-02 08:07 Daniel Pang 阅读(7953) 评论(20)  编辑 收藏 所属分类: ASP.NET2.0Enterprise Library

评论

#1楼  2006-06-02 08:33 liuwenbin [未注册用户]

请问这个在项目中如何应用呀?   回复  引用    

#2楼 [楼主] 2006-06-02 08:36 SHY520      

@liuwenbin
就像你使用ADO.NET一样   回复  引用  查看    

#3楼  2006-06-02 08:56 新东 [未注册用户]

 楼主你好,你这个Enterprise Library 2.0能不能提供下载啊。到微软那边载还要提供一个什么邮箱我不太懂耶。   回复  引用    

#4楼 [楼主] 2006-06-02 09:06 SHY520      

@新东
不好意思,那个安装文件压缩之后还有12M,我传不上去,你可以到官方网站下载,我用的是Passport的邮箱帐号   回复  引用  查看    

#5楼  2006-06-02 09:28 Terry82      

期待您写出其它模块介绍!   回复  引用  查看    

#6楼 [楼主] 2006-06-02 09:43 SHY520      

@Terry82
嗯,近期一直在看Enterprise Library 2.0,准备把其中的每个模块都介绍一下,希望你多提意见,谢谢   回复  引用  查看    

#7楼  2006-06-02 13:14 秋天的云      

1能不能分析一下Enterprise Library 2.0 源代码!
2加密web.config我没有找到,你下面文章能否带一下   回复  引用  查看    

#8楼 [楼主] 2006-06-02 13:28 SHY520      

@秋天的云
目前写的的入门系列,后面如果有时间会研究EL2.0的代码.
加密Config文件:
首先,添加对System.Configuration.dll的引用
代码如下:
Configuration config = null;
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection section = config.ConnectionStrings;

if (section.SectionInformation.IsProtected == false && section.ElementInformation.IsLocked == false)
{
section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");

section.SectionInformation.ForceSave = true;

config.Save(ConfigurationSaveMode.Full);
}   回复  引用  查看    

#9楼  2006-06-03 17:17 Jeky Lee [未注册用户]

问一下,2.0版的可以在 .net 1.1下运行吗?   回复  引用    

#10楼 [楼主] 2006-06-03 17:31 SHY520      

@Jeky Lee
它是For Net2.0的,应该不可以运行在1.0下
不过你可以下载Enterprise Library1.0来用   回复  引用  查看    

#11楼  2006-07-21 10:04 asdfgh129 [未注册用户]

DatabaseFactory.CreateDatabase(“connectionString")是如何处理
section中的ConnectionString字符串,连接到数据库的?
看了一下源代码,都没找到是在哪里处理section的?   回复  引用    

#12楼 [楼主] 2006-07-21 17:53 SHY520      

@asdfgh129
Connect String 可以用他的配置工具来建的,用配置工具打开App.Config文件,先新建一个Data Access Application Block,然后右键刚刚建的DAAB,就可以New一个Connect String了,你可以根据自己的需要把Connect String的名称给改了,我当时做的时候就直接用默认的名称的.
其实简单点理解,那个Connect String 就是我们配置的一个DAAB的实例,当然这样理解可能不太严谨,但容易理解,呵呵   回复  引用  查看    

#13楼  2006-07-24 11:25 建议 [未注册用户]

UpdateDataSet是不是就只是CommandType是StoredProcedure时候受支持呢?我试了用Text类型时一直不行,在网上找资料,英文或中文的资料用到UpdateDataSet时都是用StoredProcedure,而没有Text的。我就纳闷了是不是Text类型的在UpdateDataSet中不受支持?希望SHY520或是有做过这个的朋友们帮忙看看,谢谢.   回复  引用    

#14楼  2007-05-15 11:49 异域来者      

好东西 收下了   回复  引用  查看    

#15楼  2007-06-09 16:00 QQ:287523725 [未注册用户]

希望有志学习这方面知识的朋友请进。   回复  引用    

#16楼  2007-06-09 16:00 QQ:287523725 [未注册用户]

希望有志学习这方面朋友请加群!   回复  引用    

#17楼  2007-06-09 16:02 QQ学习群号:37794449 [未注册用户]

顶   回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-06-12 18:30 编辑过

相关链接:
 


<2006年6月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

公告

技术交流平台,真诚的希望能和园子里的朋友交流技术,共同进步!
欢迎加入Castle+IBatisNet交流群:2923364(已满),37745404
特别提示:本站文章若无特别申明,均为原创,转载请注明出自'博客园'!
Emailpwei013#163.com
MSNshypw520#gmail.com

与我联系

搜索

 

常用链接

留言簿(10)

我参与的团队

随笔分类(98)

随笔档案(74)