zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    架构设计之NodeJS操作消息队列RabbitMQ
    如何搭建一个功能复杂的前端配置化框架(一)
    Web as a App(Web既APP)的概念可以提出吗?
    Bottle源码阅读笔记(二):路由
    Bottle源码阅读笔记(一):WSGI
    Python__slots__详解
    [译]如何在Web开发中使用Python
    C#中Internal关键字的总结
    [DataContract]引用
    分享一个与ABP配套使用的代码生成器源码
  • 原文地址:https://www.cnblogs.com/pw/p/415431.html
Copyright © 2011-2022 走看看