entlib 5.0学习笔记 data access block

1. 通过sql语句查询数据库

2. 通过存储过程查询数据库

3. 使用异步方式读取数据 

1. 通过sql语句查询数据库

 1.1 添加引用,如下:

 

1.2 添加配置文件App.config,使用Entlib配置工具形成如下配置:

 

生成配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
  </configSections>
  <dataConfiguration defaultDatabase="QuickStarts Instance" />
  <connectionStrings>
    <add name="QuickStarts Instance" connectionString="Data Source=xuqiang-pc;Initial Catalog=EntLibQuickStarts;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

</configuration> 

1.3 开始编写代码,引入命名空间:

using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;

如果想要得到单个值,例如查询符合某个条件的数据库实体的数量,可以这样使用:

// 得到Database对象,data access中主要是在该对象上进行操作
            Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("QuickStarts Instance");
            String sql = "select count(*) from Customers";
            // 带有返回值,需要强制转换成int

            int count = (int)db.ExecuteScalar(CommandType.Text, sql);

如果想要返回一个DataSet类型的话,可以调用 Database的 ExecuteDataSet方法,如下:

 Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>();
            String sql = "select * from Customers";
            // 根据sql返回数据库中的多行,这里暂时是没有参数的

            DataSet ds = db.ExecuteDataSet(CommandType.Text, sql); 

1.4 代码下载

/Files/xuqiang/entlib/DataAccessBlockTestSqlString.rar 

2. 通过存储过程查询数据库 

 2.1 通过存储过程读取数据

得到 Database:

private Database m_db = EnterpriseLibraryContainer.Current.
            GetInstance<Database>("QuickStarts Instance");
读取数据:
 // ExecuteReader参数是存储过程的名字
            using (IDataReader dataReader = this.m_db.ExecuteReader("GetCategories"))
            {
                // 处理reader得到的数据
                while (dataReader.Read())
                {
                    Category item = new Category
                    (
                        dataReader.GetInt32(0),
                        dataReader.GetString(1),
                        dataReader.GetString(2)
                    );
                    this.cmbCategory.Items.Add(item);
                }

            }  

如果想要直接将结果存储在DataSet中,可以调用LoadDataSet方法:

     // 加载ds,但是这里传递了参数
            // GetProductsByCategory:调用的存储过程名字
            // dsProducts:调用完成之后,将结果填充到该参数中
            //  new String[] { "Products" }:ds中填充的表名
            // CategoryId:传递给该存储过程的参数
            this.m_db.LoadDataSet("GetProductsByCategory", this.dsProducts,
                new String[] { "Products" },

                selectedCategory.CategoryId); 

2.2 通过存储过程删除,修改,更新数据库中数据

    System.Data.Common.DbCommand insertCommand = null;

            insertCommand = this.m_db.GetStoredProcCommand("HOLAddProduct");
            this.m_db.AddInParameter(insertCommand, "ProductName", DbType.String, "ProductName", DataRowVersion.Current);
            this.m_db.AddInParameter(insertCommand, "CategoryID", DbType.Int32, "CategoryID", DataRowVersion.Current); 
            this.m_db.AddInParameter(insertCommand, "UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current);
    .......

    // 如果仅仅是执行其中的一个操作(插入,删除,修改之一),只需要
            // 将其他参数设置成null即可。
            // 通过查看重载版本可以发现该方法是能够支持事务,使用的话就是在
            // 该下面的参数中添加一个DbTransaction
            int rowsAffected = this.m_db.UpdateDataSet(this.dsProducts, "Products", insertCommand, updateCommand, deleteCommand, UpdateBehavior.Standard);

2.3  代码下载

/Files/xuqiang/entlib/DataAccssBlockStoreProcdure.rar

3. 异步方式读取数据

最终效果图:

 

关键代码:

// 开始异步读取,注册回调事件
                db.BeginExecuteReader(CommandType.Text,
                    sql,
                    EndExecuteReaderCallback,

                    db); 

 如果数据读取完成:

private void EndExecuteReaderCallback(IAsyncResult result)
        { 
            try 
            { 
                // 数据查询完成之后,调用下面的代码
                var database = (Database)result.AsyncState; 
                var ds = new DataSet();
                using (var reader = database.EndExecuteReader(result)) 
                {
                    ds.Load(reader, LoadOption.PreserveChanges, "data"); 
                }
                
                Invoke(new Action<DataSet>(FillGrid), ds); 
            } 
            catch (Exception exp) 
            {
                MessageBox.Show(exp.Message); 
            }
        }
需要注意的是由于需要使用异步的连接,所以应在连接字符串中应包含Asynchronous Processing=true。代码下载:

 /Files/xuqiang/entlib/AsynchronousDataAccess.rar

 

posted @ 2011-04-04 21:10  qiang.xu  阅读(623)  评论(0编辑  收藏  举报