首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

微软企业库 数据访问模块二

2013-04-09 
微软企业库 数据访问模块2? ? ? ?数据库访问模块都能实现哪些功能呢?数据库访问模块抽象类你正在使用的数

微软企业库 数据访问模块2

? ? ? ?数据库访问模块都能实现哪些功能呢?数据库访问模块抽象类你正在使用的数据库,提供了一些列接口,使得你可以更容易的实现常用的数据库访问功能。例如:使用Database类填充DataSet数据集,用database类获取一个适当的Command实例,然后调用database的ExecuteDataSet方法,就可以填充数据集。不需要你调用DataAdapter的Fill方法。ExecuteDataSet方法管理数据库连接,实现了填充数据集所需要的所有工作。使用类似的方法,通过database类可以直接执行command,可以获取一个DataReader实例,可以用dataset中的数据更新数据库。模块也支持多个操作的事务,如果失败的话,可以回滚。

  除了使用ADO.NET也能完成的常用功能以外,模块还支持异步访问数据库(只要数据支持)。还可以返回客户端可以用LINQ查询的数据的序列对象形式。

  使用数据访问模块的主要优点,除了简化开发以外,它使得你可以创建一种provider独立的应用,可以很容易的更换不同的数据提供源。在大多数情况下,除非你在代码中指定了数据库类型,剩下的就是更改配置文件中的连接字符串配置节就可以了。不需要你修改代码中的sql查询和存储过程及其参数。

  数据访问模块提供的常用方法

  下面列出一些模块常用的获取数据、更新数据方法,其中有一些和直接使用ADO.NET中的方法很相似。

  

?

?

方法

功能

ExecuteDataset,创建,加载,返回数据集

LoadData,加载数据到一个已经存在的数据集

UpdateDataSet,使用已经存在的数据集更新数据库内容

填充一个数据集,使用数据集更新数据库

ExecuteReader,创建,返回一个provider独立的DbDataReader实例

从数据库读取多行数据

ExecuteNonQuery,执行command,返回数据库受影响的行数,可以通过output返回多个值

ExecuteScalar,执行command,返回单个值

执行command数据库命令对象

ExecuteSproAccessor,使用存储过程返回一个客户端可以查询的序列对象

ExecuteSqlStringAccessor,使用SQL语句返回一个客户端可以查询的序列对象

以序列对象的形式返回数据

ExecuteXmlReader,返回xml格式的数据,xmlReader类型,这个只能用在SQL Server数据库,通过SqlDatabase类调用,Database类中没有这个方法。

获取xml格式数据(只能用在SQL Server数据库)

GetStoredProcCommand,返回一个存储过程的数据库command对象

GetSqlStringCommand,返回一个SQL语句的数据库command对象

创建一个Command对象

AddInParameter,创建一个新的input参数,并且加入command的参数集合

AddOutParameter,创建一个新的output参数,并且加入command的参数集合

AddParameter,创建一个指定类型的参数,并且加入command的参数集合

GetParameterValue,以Object类型返回指定参数的值

SetParameterValue,给指定参数赋值

?

处理command的参数

CreateConnection,创建,返回当前数据库的连接,允许你通过这个链接初始化和管理数据库事务

处理数据库事务

?

?

????? 如果你使用SqlDatabase类的话,可以使用Begin和End类型的方法实现数据库异步操作。

????? 如何使用数据库访问模块

????? 1首先通过企业库的配置工具添加模块配置

????? 2在代码中添加如下代码

?????

?

微软企业库 数据访问模块二微软企业库 数据访问模块二微软企业库 数据访问模块二微软企业库 数据访问模块二微软企业库 数据访问模块二微软企业库 数据访问模块二

????? 上图是一个使用Accessor访问数据库,返回对象形式的数据的过程。

?

转自:http://www.cnblogs.com/virusswb/archive/2010/05/14/Enterprise-Library-DataAccessBlock-3.html

?

?

以对象形式从数据库获取数据

  现代的很多编程技术都集中在“数据就是对象”这个概念。如果你在应用层之间使用Data Transfer Objects (DTOs)传输数据的话,这个方法就很有用,使用ORM实现一个数据访问层,或者是客户端查询技术,例如LINQ。

  数据库访问模块实现了这个功能,允许你执行SQL或者是存储过程,可以返回一个对象序列,但是要求序列实现IEnumerable接口。

  关于Accessors

  模块提供了两个方法来实现这种查询要求,SprocAccessor和SqlStringAccessor。你可以使用Database类的ExecuteSprocAccessor和ExecuteSqlStringAccessor,或者是创建一个Accessor,然后调用它的Execute方法。

  下面是一张查询示意图

  微软企业库 数据访问模块二

  Accessor使用另外两个对象,一个用来管理传入accessor的参数,一个用来将数据库返回的数据行映射成客户端需要的对象。

  如果你没有指定一个参数映射,accessor会使用默认的参数映射。默认情况下这个功能只能用于执行SQL Server和Oracle的存储过程。不能执行SQL 语句,或者是其他的数据库和provider,如果需要的话,可以自定义参数映射器。

  如果你没有指定一个对象映射,模块使用默认的对象映射,根据列的名称映射到对象的属性。你也可以自定义对象映射,将列映射到指定的对象属性上去。

  创建和执行Accessor

  

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

?

?

  上面假设由一个Product类,有ID,Name,Description三个属性。

  创建和使用映射Mappers

  在某些情况下,你需要自定义参数映射,将你的参数传递给要执行查询的accessor。这种典型的情况发生在,你需要执行一个SQL语句,和一个不支持参数的数据库进行交互,或者是默认的参数映射的参数个数或者是类型不匹配。参数映射类需要实现IParameterMapper接口,有一个AssignParameters方法引用了Command对象作为参数,你需要做的就是将需要的参数加入Command对象的Parameters集合。

  在更多的情况你需要一个自定义对象映射。为了帮助你完成这个需求,模块提供了MapBuilder类,用它可以创建列和对象属性的映射关系。

  默认情况,accessor可以返回一个简单的对象序列。但是,有时候需要返回一个复杂的对象序列,例如,返回Orders的同时返回相关的OrderLines。简单的映射不能满足这样的需求,MapBuilder类也不能满足了。你需要实现IResultSetMapper接口,自定义对象映射关系。

  获取XML数据

  企业库提供了ExecuteXmlReader方法返回一个XmlReader对象。目前为止,还只能支持SQL Server数据库,意味着你只能用SqlDatabase类。

  你需要把Database转换成SqlDatabse,或者是用构造函数直接创建一个SqlDatabse。

  

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

?

?

  获取单个值

  

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

?

  异步获取数据

  1)准备配置文件

  需要在连接字符串中添加Asynchronous Processing=true或者是async=true。

  

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

?

  另外,企业库中的异步访问数据库只支持SQL Server。在Database类由一个属性SupportsAsync,可以用来查询当前数据库是否支持异步访问。

  

?

?

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

?

  使用异步访问数据库通常需要一个callback,在调用端会打开另外一个线程。这个callback通常不会直接访问winform和wpf的用户界面。你需要在用户界面添加事件,然后通过委托的方式更新用户界面。

  委托可以使用Lambda表达式实现。

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

  

?

  异步获取对象形式返回的数据

  

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

?

  更新数据库

  

?

微软企业库 数据访问模块二微软企业库 数据访问模块二代码<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->string?oldDescription
=?"Carries?4?bikes?securely;?steel?construction,?fits?2"?receiver?hitch.";
string?newDescription?=?"Bikes?tend?to?fall?off?after?a?few?miles.";
//?Create?command?to?execute?the?stored?procedure?and?add?the?parameters.
DbCommand?cmd?=?defaultDB.GetStoredProcCommand("UpdateProductsTable");
defaultDB.AddInParameter(cmd,?"productID",?DbType.Int32,?84);
defaultDB.AddInParameter(cmd,?"description",?DbType.String,?newDescription);
//?Execute?the?query?and?check?if?one?row?was?updated.
if?(defaultDB.ExecuteNonQuery(cmd)?==?1)
{
//?Update?succeeded.
}

else
{
Console.WriteLine("ERROR:?Could?not?update?just?one?row.");
}
//?Change?the?value?of?the?second?parameter
defaultDB.SetParameterValue(cmd,?"description",?oldDescription);
//?Execute?query?and?check?if?one?row?was?updated
if?(defaultDB.ExecuteNonQuery(cmd)?==?1)
{
//?Update?succeeded.
}
else
{
Console.WriteLine("ERROR:?Could?not?update?just?one?row.");
}微软企业库 数据访问模块二微软企业库 数据访问模块二  

?

  将DataSet中的数据更新回数据库

  如果要更新数据库,可以使用Database的UpdateDataSet方法,返回受影响的行数总和。

  有一个参数是UpdateBehavior,决定了更新目标数据库表的方式。包括下面的几个值:

  Standard:如果更新失败,停止更新。

  Continue:如果更新失败,将继续其他的更新。

  Transactional:如果更新失败,所有的操作都将回滚。

  另外你还可以为UpdateDataSet方法的UpdateBatchSize参数提供一个值,设置更新方式为批量更新而不是一个一个的发送到数据库。这么做更高效,但是返回值就是最后一次批量发送的影响行数了,而不是所有的更新总数。

  加载数据到一个已经存在的DataSet  

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

?

  更新数据库UpdateDataSet

?

微软企业库 数据访问模块二微软企业库 数据访问模块二

?

?

?

  以数据库连接为基础的事务操作

  就是操作一个数据库,以一个数据库连接为基础。

  一个常用的数据库解决方案,都会包括一些事务的处理,例如银行的转账。

  事务要满足ACID原则:

  Atomicity,原子性,所有的操作要么都成功,要么都失败。

  Consistency,一致性,数据在事务之前和之后保持数据的一致性。  

  Isolation,隔离性,在事务操作的过程中,其他操作不能访问和查看数据。

  Durability,一旦事务成功,在系统中产生的变化将是永久的。

  详细介绍参看:http://www.360doc.com/content/08/0426/18/61497_1217187.shtml

  

微软企业库 数据访问模块二微软企业库 数据访问模块二  

?

  分布式的事务

  如果你的事务包含了访问不同的数据库,或者是包括了消息队列的访问,你必须使用分布式的事务。例如windows的Distributed transaction coordinator(DTC)服务。

  使用TransactionScope类

  

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->using?(TransactionScope?scope
=?new?TransactionScope(TransactionScopeOption.RequiresNew))
{
//?perform?data?access?here
}

?

  扩展模块使用其他类型的数据库

  企业库默认支持SQL Server、Oracle和SQL CE。但是你可以扩展来支持更多的数据库。自定义一个provider或者是引入第三方的provider。

  如果是自定义一个provider,你可以继承Database类,然后重写里面的一些方法。在方法中处理一些细节,例如返回值,参数的前缀(@),数据类型转换,和其他的一些相关因素。

转自:http://www.cnblogs.com/virusswb/archive/2010/05/16/Enterprise-Library-5-0-DataAccess-4.html

热点排行