Enterprise Library 2.0 Hands On Lab 翻译(2):数据访问程序块(二)

简介:
练习2:存储过程和使用程序块更新数据
该练习将示范如何用数据访问应用程序调用存储过程,并使用强类型的DataSet来更新数据。
 
第一步
打开DataEx2.sln项目,默认的安装路径应该为C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Data Access\exercises\ex02\begin,并编译。
 
第二步 在QuickStarts数据库中添加Categories数据表
运行批处理文件SetUpEx02.bat,它默认的路径安装路径为C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Data Access\exercises\ex02\DbSetup,默认的服务器实例为(local)\SQLEXPRESS,如果需要修改,用记事本打开SetUpEx02.bat,修改为自己的德数据库服务器实例。执行后将会在数据库中创建Categories数据表和存储过程GetCategories,并会在表中插入一些数据。
 
第三步 回顾应用程序
在解决方案管理器中,选中MainForm.cs文件,选择 View | Designer 菜单,应用程序主要是选择一个特定的Category,它将会加载该类别下的所有产品,允许我们作一些修改并保存。
 
第四步 实现数据的读取
1 .在解决方案管理器中选择MainForm.cs,选择View | Code 菜单命令,在代码中添加如下命名空间,在这之前请先添加对DataCommon两个程序集的引用,可以参考练习一。
using  Microsoft.Practices.EnterpriseLibrary.Data;
2 .在窗体中加入如下私有域,后面将会在多个地方用到该数据库实例。
private  Database _db  =  DatabaseFactory.CreateDatabase( " QuickStarts Instance " );
3 .在MainForm_Load方法中加入如下代码
private   void  MainForm_Load( object  sender, System.EventArgs e)

{
    
this.cmbCategory.Items.Clear();

    
// TODO: Use a DataReader to retrieve Categories

    
using (IDataReader dataReader = _db.ExecuteReader("GetCategories"))

    
{
        
// Processing code 

        
while (dataReader.Read())

        
{
            Category item 
= new Category(

                dataReader.GetInt32(
0),

                dataReader.GetString(
1),

                dataReader.GetString(
2));

            
this.cmbCategory.Items.Add(item);

        }


    }


    
if (this.cmbCategory.Items.Count > 0)

        
this.cmbCategory.SelectedIndex = 0;

}
重载的方法 Database.ExecuteReader,有一个字符串类型的参数,通过它来指定存储过程的名称,在这里我们不用做任何数据库连接方面的管理,但是在 DataReader使用完毕后释放很重要,这些都会由上面的代码来完成,当 DataReader释放后,数据库连接也将被关闭。
4 .在cmbCategory_SelectedIndexChanged方法中加入如下代码,它将根据我们选择的类别来读取对应的Product的集合。
private   void  cmbCategory_SelectedIndexChanged( object  sender, System.EventArgs e)

{
    
this.dsProducts.Clear();

    Category selectedCategory 
= (Category)this.cmbCategory.SelectedItem;

    
if (selectedCategory == null)

        
return;


    
// TODO: Retrieve Products by Category

    _db.LoadDataSet(

        
"GetProductsByCategory",

        
this.dsProducts,

        
new string[] "Products" },

        selectedCategory.CategoryId);

}
在数据访问应用程序块中 Database类提供了两个关于 DataSet的方法 ExecuteDataSetLoadDataSetExecuteDataSet返回一个新的 DataSetLoadDataSet则返回一个已经存在的 DataSet
 
第五步 实现数据的更新
btnSave_Click方法中加入如下代码,将会把所有的任何改动更新到数据库中去。
private   void  btnSave_Click( object  sender, System.EventArgs e)

{
    
// TODO: Use the DataSet to update the Database 

    System.Data.Common.DbCommand insertCommand 
= null;

    insertCommand 
= _db.GetStoredProcCommand("HOLAddProduct");

    _db.AddInParameter(insertCommand, 
"ProductName",

        DbType.String, 
"ProductName", DataRowVersion.Current);

    _db.AddInParameter(insertCommand, 
"CategoryID",

        DbType.Int32, 
"CategoryID", DataRowVersion.Current);

    _db.AddInParameter(insertCommand, 
"UnitPrice",

        DbType.Currency, 
"UnitPrice", DataRowVersion.Current);

    System.Data.Common.DbCommand deleteCommand 
= null;

    deleteCommand 
= _db.GetStoredProcCommand("HOLDeleteProduct");

    _db.AddInParameter(deleteCommand, 
"ProductID",

        DbType.Int32, 
"ProductID", DataRowVersion.Current);

    _db.AddInParameter(deleteCommand, 
"LastUpdate",

        DbType.DateTime, 
"LastUpdate", DataRowVersion.Original);

    System.Data.Common.DbCommand updateCommand 
= null;

    updateCommand 
= _db.GetStoredProcCommand("HOLUpdateProduct");

    _db.AddInParameter(updateCommand, 
"ProductID",

        DbType.Int32, 
"ProductID", DataRowVersion.Current);

    _db.AddInParameter(updateCommand, 
"ProductName",

        DbType.String, 
"ProductName", DataRowVersion.Current);

    _db.AddInParameter(updateCommand, 
"CategoryID",

        DbType.Int32, 
"CategoryID", DataRowVersion.Current);

    _db.AddInParameter(updateCommand, 
"UnitPrice",

        DbType.Currency, 
"UnitPrice", DataRowVersion.Current);

    _db.AddInParameter(updateCommand, 
"LastUpdate",

        DbType.DateTime, 
"LastUpdate", DataRowVersion.Current);

    
int rowsAffected = _db.UpdateDataSet(

        
this.dsProducts,

        
"Products",

        insertCommand,

        updateCommand,

        deleteCommand,

        UpdateBehavior.Standard);

}
在更新一个数据库时,需要对 DataTable的列和存储过程中的参数之间作一个映射,重载的方法 UpdateDataSet,它通过数据访问程序块自动执行更新事务,在这里 UpdateBehaviour是可以设置的,它有三种类型: TransactionalContinueStandard
 
第六步 运行应用程序
选择Debug | Start Without Debugging菜单命令并运行应用程序,在Category下拉框中选择一个类别,观察如何加载和保存数据。
 
更多Enterprise Library的文章请参考《Enterprise Library系列文章









本文转自lihuijun51CTO博客,原文链接:http://blog.51cto.com/terrylee/67631  ,如需转载请自行联系原作者
相关文章
|
安全 Java 关系型数据库
深入探究Python的多线程与异步编程:实战与最佳实践
【2月更文挑战第1天】 深入探究Python的多线程与异步编程:实战与最佳实践
|
域名解析 网络协议 应用服务中间件
服务器主机名值命名规范
服务器主机名值命名规范
808 0
|
SQL 消息中间件 分布式计算
Flink 面试指南 | 终于要跟大家见面了,我有点紧张。(附思维导图)
面试,一个令人大多数同学头疼的问题,要么成功进入心仪公司,要么沮丧与其失之交臂。但是,如果能在面试前就能知道面试官将会问的问题,然后可以好好提前准备,这种感觉是不是特别棒?
Flink 面试指南 | 终于要跟大家见面了,我有点紧张。(附思维导图)
|
9月前
|
SQL 关系型数据库 MySQL
详解如何优雅实现先分组再组内排序取数据解决方案
本文介绍了在数据库查询中常见的业务需求:先对数据进行分组,然后在每组内按规则排序并取出特定记录。使用MySQL和Elasticsearch实现这一操作,并对比了不同方法的性能。具体包括: **MySQL实现**:通过窗口函数`ROW_NUMBER()`、子查询和JOIN关联查询三种方式实现分组排序取数据,并探讨了索引优化的效果。 **Elasticsearch实现**:利用`terms`聚合和`top_hits`聚合实现分组排序,适用于大规模数据场景。 推荐优先使用窗口函数,结合索引优化提升查询性能。对于小规模查询,可在应用层处理。 通过实例和性能对比,帮助读者选择最适合的实现方案。
355 16
详解如何优雅实现先分组再组内排序取数据解决方案
|
监控 Java 应用服务中间件
Sentinel原理及实践
Sentinel原理及实践
534 1
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
230 0
|
存储 数据可视化 编译器
面向 C++ 的现代 CMake 教程(二)(2)
面向 C++ 的现代 CMake 教程(二)
400 0
|
机器学习/深度学习 算法 文件存储
使用Python实现深度学习模型:神经架构搜索与自动机器学习
【7月更文挑战第5天】 使用Python实现深度学习模型:神经架构搜索与自动机器学习
300 2
|
消息中间件 Unix Java
进程间通信(IPC)的各种方式与比较
进程间通信(IPC)的各种方式与比较
|
存储 分布式计算 NoSQL
setnx分布式锁原理RedisTemplate实现setnx分布式锁
setnx分布式锁原理RedisTemplate实现setnx分布式锁
528 0