Enterprise Library Step By Step系列(四):数据访问程序块——进阶篇

 写在前面:在进阶篇中,主要通过对使用存储过程,使用事务,加密连接串三部分内容的介绍,给企业库的初学者提供一点帮助。

一.  使用存储过程:

关于数据访问应用程序块的介绍在入门篇里面已经说过了,这里不再重复。下面我们来看看在数据访问应用程序块里面使用存储过程的方法:

1.        不传递参数:不传递参数时值需要指定存储过程的名称,已经命令的类型即可。

 1/// <summary>
 2        /// 执行存储过程(1)——不传递参数(NoPara)
 3        /// </summary>

 4        private void FormatDataBySp1()
 5        {
 6            ///创建数据库实例
 7            Database db = DatabaseFactory.CreateDatabase("NorthWind");
 8            
 9            ///传递参数
10            DBCommandWrapper dbc = db.GetStoredProcCommandWrapper("GetProductsList");
11
12            ///执行存储过程
13            DataSet ds = db.ExecuteDataSet(dbc);
14            
15            ///绑定数据
16            DataGrid1.DataSource = ds.Tables[0];
17            DataGrid1.DataBind();
18        }

2.        传递输入参数:需要注意的是在增加参数时是AddInParameter

 1/// <summary>
 2        /// 执行存储过程(2)——传递输入参数(Input)
 3        /// </summary>

 4        private void FormatDataBySp2()
 5        {
 6            ///创建数据库实例
 7            Database db = DatabaseFactory.CreateDatabase("NorthWind");
 8            
 9            ///传递参数
10            DBCommandWrapper dbc = db.GetStoredProcCommandWrapper("CustOrdersDetail");
11            dbc.AddInParameter("@OrderID",System.Data.DbType.Int32,10248);
12
13            ///执行存储过程
14            DataSet ds = db.ExecuteDataSet(dbc);
15            
16            ///绑定数据
17            DataGrid1.DataSource = ds.Tables[0];
18            DataGrid1.DataBind();
19        }

3.        传递输出参数:需要注意的是在增加参数时是AddOutParameter

 1/// <summary>
 2        /// 执行存储过程(3)——传递输出参数(Output)
 3        /// </summary>

 4        private void FormatDataBySp3()
 5        {
 6            ///创建数据库实例
 7            Database db = DatabaseFactory.CreateDatabase("NorthWind");
 8            
 9            ///传递参数
10            DBCommandWrapper dbc = db.GetStoredProcCommandWrapper("GetProductDetails");
11
12            dbc.AddInParameter("@ProductID",System.Data.DbType.Int32,12);
13            dbc.AddOutParameter("@ProductName",System.Data.DbType.String,50);    //输出
14
15            ///执行存储过程
16            db.ExecuteNonQuery(dbc);
17            
18            string result = dbc.GetParameterValue("@ProductName").ToString();    //得到输出参数的值
19        }

二.  使用事务:

在企业库数据访问应用程序块里面,对事务提供了很好的支持,具体的使用方法在程序里面有注释,这里就不多说了。

 1/// <summary>
 2        /// 利用事务更改数据
 3        /// </summary>

 4        private void ExecuteUseTran()
 5        {
 6            ///创建数据库实例
 7            Database db = DatabaseFactory.CreateDatabase("NorthWind");
 8
 9            using(IDbConnection Idbconn = db.GetConnection())
10            {    
11                ///打开连接
12                Idbconn.Open();
13                
14                ///创建事务
15                IDbTransaction Idbtran = Idbconn.BeginTransaction();
16
17                try
18                {    
19                    ///执行两个存储过程
20                    db.ExecuteNonQuery(CommandType.StoredProcedure,"InserOrders");
21                    db.ExecuteDataSet(CommandType.StoredProcedure,"UpdateProducts");
22                    
23                    ///执行完成后提交事务
24                    Idbtran.Commit();
25                }

26                catch
27                {    
28                    ///回滚事务
29                    Idbtran.Rollback();
30                }

31                finally
32                {
33                    ///关闭连接
34                    Idbconn.Close();
35                }

36            }

37
38        }

三.  加密连接字符串:

1.        创建一个加密的Stored Provider

2.        创建新的加密算法:




3.       
选择加密算法:


4.       
创建加密密钥:


5.        保存加密密钥的保存文件,该文件要小心保存:

6.        指定加密的部分:

 

这样我们看到,在配置文件里面的内容变成了乱码。

总结:关于数据访问应用程序块的进阶篇就写到这里了,希望对初学企业库的朋友有所帮助

 

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2005-10-21 10:32 TerryLee 阅读(9217) 评论(59)  编辑 收藏 所属分类: Enterprise Library

  回复  引用  查看    
#1楼 2005-10-21 18:03 |       
谢谢你对初学者的帮助,不要放弃,支持!
  回复  引用  查看    
#2楼 2005-10-22 16:37 | dudu      
文章中的乱码文字影响了RSS的显示。
  回复  引用  查看    
#3楼 [楼主]2005-10-24 12:06 | Terrylee      
To:杰
:)有你的支持,一定写完
  回复  引用  查看    
#4楼 [楼主]2005-10-24 12:07 | Terrylee      
TO:dudu
不好意思,我没注意这事
以后会注意了^_^
  回复  引用    
#5楼 2005-11-04 12:08 | 禅印 [未注册用户]
写的非常好,感谢你对大家伙的贡献。
  回复  引用  查看    
#6楼 [楼主]2005-11-04 13:39 | Terrylee      
@禅印
非常感谢你的支持:)
  回复  引用  查看    
#7楼 2005-11-15 10:17 | jinta2001      
在本篇如果介绍到对ORACLE游标的处理、如何解决更新的时候ORACLE会把空字符转成NULL的问题就比较完美了,初学者往往在这上面栽跟斗
  回复  引用  查看    
#8楼 [楼主]2005-11-15 10:56 | Terrylee      
@jinta2001

非常感谢你的建议

这个问题园子里面的一位师兄以前好想写过

由于我对ORACLE游标研究不深

所以就没写这方面的问题:)

也谢谢你对本系列随笔的关注
  回复  引用    
#9楼 2005-11-28 22:01 | hj [未注册用户]
感觉非常好,容易理解,谢谢!
  回复  引用  查看    
#10楼 [楼主]2005-11-29 09:05 | Terrylee      
@hj

^_^
  回复  引用  查看    
#11楼 2005-12-01 18:25 | 栖息的熊      
楼主,我在做第一个方法的例子时就出错了,具体位置是Database.cs文件的DoLoadDataSet方法的adapter.Fill(dataSet).
  回复  引用  查看    
#12楼 [楼主]2005-12-02 08:18 | Terrylee      
@栖息的熊

您先看一下存储过程名是否正确?
  回复  引用  查看    
#13楼 2005-12-02 08:33 | 栖息的熊      
正确,你提供的那个存储过程不存在,我就找了个northwind里现成的,还是出现那个问题。错误提示,就是系统错误。
  回复  引用  查看    
#14楼 [楼主]2005-12-02 08:54 | Terrylee      
@栖息的熊

我也想不来是什么问题了^_^

因为我这边模拟不出来这个错误

我再看看吧
  回复  引用  查看    
#15楼 2005-12-02 14:58 | 栖息的熊      
呵呵,找到问题了,我新建的用户没有操作的权限,重新设了一下就好了。用现成的存储过程好像都会有这个问题。^_^

  回复  引用  查看    
#16楼 [楼主]2005-12-02 15:07 | Terrylee      
@栖息的熊

好的,又学到了一点:)

交流就会有进步,以后我们多多交流啊!!!
  回复  引用  查看    
#17楼 2005-12-15 02:16 | 666.NET      
很高兴可以跟你一起研究企业库,不过我没有你写得这么好,以后请多多指教哟,呵~

http://ryu666.cnblogs.com/category/39631.html


  回复  引用  查看    
#18楼 [楼主]2005-12-15 08:55 | Terrylee      
@666.NET

客气,大家互相学习嘛……

呵呵
  回复  引用  查看    
#19楼 2005-12-19 09:54 | yanjun      
请教一下,我按照上面的配置,但是一直抱错 ,是不是我用户配置有问题啊?
[SqlException: 用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败。]

  回复  引用  查看    
#20楼 2005-12-19 10:03 | yanjun      
通过系统管理添加network service用户和在数据库添加用户问题已经解决,但是我也配置了sa啊,为什么不行哦???
谢谢
  回复  引用  查看    
#21楼 [楼主]2005-12-19 11:13 | Terrylee      
@yanjun

看一下你的SQL Server2000中的用户的登录设置吧

是不是混合验证?
  回复  引用  查看    
#22楼 2005-12-19 15:16 | yanjun      
对,是混合验证啊
Sql 与window验证,有影响吗,它不是用sa登陆吗,干吗还涉及到network service呢

谢谢
  回复  引用  查看    
#23楼 [楼主]2005-12-20 08:39 | Terrylee      
@yanjun

还有一点,就是登录系统时的用户是否具有管理员权限

我能想到的就这么多了
  回复  引用  查看    
#24楼 2005-12-20 11:57 | yanjun      
我是用admin登陆的,绝对没有限制的,
我是2003的系统,ntfs格式的
谢谢

还有我在用asp.net的写日志的时候,写系统事件日志没有问题,但是我选择写errorlog.log的时候,它怎么就提示不能写注册表啊,这是什么原因啊
  回复  引用  查看    
#25楼 2005-12-29 10:48 | yanjun      
用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败。

源错误:


行 23: dbc.AddInParameter("@password",System.Data.DbType.String,password);
行 24: dbc.AddOutParameter("@reason",System.Data.DbType.String,50);
行 25: db.ExecuteNonQuery(dbc);
行 26: string LoginID;
行 27: LoginID=dbc.GetParameterValue("@reason").ToString();


源文件: e:\officeanywhere\operations\security\oapwd.cs 行: 25

堆栈跟踪:


[SqlException: 用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败。]
System.Data.SqlClient.ConnectionPool.GetConnection(Boolean& isInTransaction)
System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean& isInTransaction)
System.Data.SqlClient.SqlConnection.Open()
Microsoft.Practices.EnterpriseLibrary.Data.Database.OpenConnection()
Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DBCommandWrapper command)
Operations.OAPwd.Login(String loginid, String password) in e:\officeanywhere\operations\security\oapwd.cs:25
OAnywhere.WebForm1.butOk_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\oanywhere\login.aspx.cs:66
System.Web.UI.WebControls.Button.OnClick(EventArgs e)
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain()


请教这是什么原因造成的,我的系统是2003,数据库sql2000,采用win+sql验证方式
谢谢
  回复  引用  查看    
#26楼 2005-12-29 11:54 | yanjun      
问题已经解决,是由于我在配置 的时候选择了window认证,就是把Integrated Security的数值为true,为false就是用户认证了,谢谢

  回复  引用  查看    
#27楼 [楼主]2005-12-30 08:37 | Terrylee      
@yanjun

抱歉,这两天太忙了

没来得给你回复……

问题解决了就好,呵呵
  回复  引用    
#28楼 2005-12-31 10:54 | emails [未注册用户]
用事务的时候提示这个错,我用的是Enterprise Library 2005 CTP版,
Microsoft.Practices.EnterpriseLibrary.Data.Database' does not contain a definition for 'GetConnection'


请教一下是怎么回事?谢谢!
  回复  引用  查看    
#29楼 [楼主]2005-12-31 11:11 | Terrylee      
@emails

我还没开始用Enterprise Library 2005 CTP

在1.1版本里面它提供了GetConnection这个方法,2.0里面不知道它是怎么设计的,你查看一下帮助文档,应该有这样的一个方法




  回复  引用    
#30楼 2005-12-31 12:21 | emails [未注册用户]
谢谢。我再看看。
第一次用Enterprise Library,你写这些文章帮了我大忙。
  回复  引用  查看    
#31楼 [楼主]2005-12-31 12:37 | Terrylee      
@emails

呵呵,不用客气

06年有时间我会再写一写EL2.0与1.1的有变化的地方
  回复  引用  查看    
#32楼 2006-01-03 12:11 | sema      
Enterprise Library 好像不支持Access数据库
  回复  引用  查看    
#33楼 [楼主]2006-01-03 12:21 | Terrylee      
@sema

可以通过自己去扩展……
  回复  引用  查看    
#34楼 2006-04-17 13:25 | 梁广永      
学习,
  回复  引用  查看    
#35楼 2006-08-01 12:56 | main      
2006一月的版本的似乎有些差距:(
能不能用贴出这个版本的使用过程阿?
  回复  引用    
#36楼 2006-09-22 11:37 | 凌风[匿名] [未注册用户]
你好,我有一个问题请教。
还是关于事务的问题。
我举个简单的例子吧
有多个业务对象如 A、B、C、D(假如都具有Save方法,他们都是独立的对象,也要求事务控制)
现在我有另一个业务对象E他需要调用A、B、C、D的Save()方法。
这个时候我怎么去控制他们的事务呢?
还有很多问题,想请教你,不知道怎么联系你。



  回复  引用  查看    
#37楼 2006-09-22 11:46 | 栖息的熊      
To凌风:这个问题可以用全局事务来解决。
  回复  引用    
#38楼 2006-11-13 15:06 | Lee[匿名] [未注册用户]
问个问题
==========
Database db = DatabaseFactory.CreateDatabase("NorthWind");

DBCommandWrapper dbc = db.GetStoredProcCommandWrapper("CustOrdersDetail");
dbc.AddInParameter("@OrderID",System.Data.DbType.Int32,10248);

DataSet ds = db.ExecuteDataSet(dbc);

DataGrid1.DataSource = ds.Tables[0];
DataGrid1.DataBind();
==========
如果那个存储过程只是一个update
有N个参数 像这样
update aTable set a1=@p1,a2=@p2,... where id=100
只更新a1的话
是不是就只添加
dbc.AddInParameter("@p1",System.Data.DbType.Int32,10248);
就可以了

别的参数都怎么处理了
是不是跟原来的
"update aTable set a1=?,a2=?,... where id=?"
一个效果
  回复  引用  查看    
#39楼 [楼主]2006-11-13 16:58 | TerryLee      
@Lee[匿名]
所有的参数都必须提供
  回复  引用    
#40楼 2006-11-13 18:22 | Lee[匿名] [未注册用户]
那我只想更新其中的几个字段怎么办哩?
  回复  引用    
#41楼 2007-01-20 11:23 | xlx [未注册用户]
我想知道李兄用的是哪个版本的Enterprise Library
为什么我用的Enterprise Library没有 Configuration Application Blok呢?
我是用2.0的,请问我该如何使用加解手段?
急盼回复!

  回复