Enterprise Library 2.0 -- Data Access Application Block (补充)

      前几天一位热心的朋友询问如何在DataAccess Application Block中将参数单独写成一个方法,以方便频繁调用一些存储过程,也可以将这些参数装入缓存以提高程序执行效率,下面将实现该功能的代码贴出来,希望对正在研究这方面知识的朋友有所帮助.

        /// <summary>
        
/// 该方法用于返回一个存储过程的参数数组
        
/// 从而方便了我们在程序中反复调用
        
/// 而且我们可以将返回的参数数组装入缓存,提高程序执行效率
        
/// </summary>
        
/// <param name="db">数据库连接</param>
        
/// <param name="spName">存储过程名称</param>
        
/// <returns>返回参数数组</returns>

        public DbParameter[] GetDBCommandParameters(Database db , string spName)
        
{
            
//建立一个存储过程的DBCommand
            DbCommand dbcomm = db.GetStoredProcCommand(spName);
            
//根据字面意思可以看到执行该方法是发现DBCommand的参数,即得到该DBCommand的参数
            db.DiscoverParameters(dbcomm);
            
//测试了一下,不管存储过程有没有返回值,在这个参数数组的0位置都是一个@return_value参数,奇怪,将其移出
            dbcomm.Parameters.RemoveAt(0);
            
//定义一个新的参数数组,并将DBCommand中的参数复制到该数组中
            DbParameter[] result = new DbParameter[dbcomm.Parameters.Count];
            dbcomm.Parameters.CopyTo(result,
0);

            
//将参数的初值设为空
            foreach (DbParameter dp in result)
            
{
                dp.Value 
= DBNull.Value;
            }


            
return result;
        }


然后我们在写一个给参数数组赋值的方法,如下:

        /// <summary>
        
/// 对参数数组赋值
        
/// </summary>
        
/// <param name="commandParameters">参数数组</param>
        
/// <param name="parameterValues">对应值数组</param>

        public void AssignParameters(DbParameter[] commandParameters, object[] parameterValues)
        
{
            
if ((commandParameters == null|| (parameterValues == null))
            
{
                
return;
            }


            
if (commandParameters.Length != parameterValues.Length)
            
{
                
throw new ArgumentException("参数数组长度不匹配!");
            }


            
for (int i = 0, j = commandParameters.Length; i < j; i++)
            
{
                commandParameters[i].Value 
= parameterValues[i];
            }



        }


然后我们就可以在程序中按照如下方法调用存储过程了:

        [TestMethod]
        
public void SelectPersonBySex()
        
{
            
string sex = "";

            
//创建默认的数据库实例
            Database db = DatabaseFactory.CreateDatabase();
            
string spName = "SelectPersonBySex";

            
//DbCommand dbcomm = db.GetStoredProcCommand(spName);

            
//得到该存储过程的参数数组
            DbParameter[] parameters = this.GetDBCommandParameters(db, spName);
            
object[] strValues = new object[] { sex };
            
//对参数数组赋值
            this.AssignParameters(parameters, strValues);

            DataSet ds 
= db.ExecuteDataSet(spName, parameters);

            Assert.AreEqual(ds.Tables[
0].Rows.Count,1);
        }


Email:pwei013@163.com

posted on 2006-06-12 18:28 Daniel Pang 阅读(4961) 评论(3)  编辑 收藏 网摘 所属分类: Enterprise Library

评论

#1楼 2006-09-09 09:42 jeky      

看到你的文章后,我也写了一篇:

http://www.cnblogs.com/jeky/archive/2006/09/08/499032.html
  回复  引用  查看    

#2楼 2007-05-28 12:39 zzticzh[未注册用户]

这样给存储过程参数赋值也是可以的,不过得知道存储过程参数的个数和顺序
//创建一个名为ConnectionString的数据库实例
Database db = DatabaseFactory.CreateDatabase("ConnectionString");
object[] classparam = new object[2];

//创建object数组,用于存放储存过程参数

//参数的赋值顺序与存储过程参数的声明顺序要一致
classparam[0] = "1021";
classparam[1] = "test library";
db.ExecuteNonQuery("UP_classinfo_ADD", classparam);

  回复  引用    

#3楼 2008-12-01 09:55 sky pan[未注册用户]

//得到该存储过程的参数数组
DbParameter[] parameters = this.GetDBCommandParameters(db, spName);
object[] strValues = new object[] { sex };
//对参数数组赋值
this.AssignParameters(parameters, strValues);

DataSet ds = db.ExecuteDataSet(spName, parameters);

请问LZ,你这方法测试过了吗?

DataSet ds = db.ExecuteDataSet(spName, parameters);这句应该改为如下吧:
DataSet ds = db.ExecuteDataSet(spName, strValues );
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 424131 NjlsiHFz4KU=



相关文章:

相关链接:
<2006年6月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

公告

技术交流平台,真诚的希望能和园子里的朋友交流技术,共同进步!
欢迎加入Castle+IBatisNet交流群:2923364(已满),37745404
特别提示:本站文章若无特别申明,均为原创,转载请注明出自'博客园'!
Emailpwei013#163.com
MSNshypw520#gmail.com

与我联系

搜索

 

常用链接

留言簿

我参与的团队

随笔分类(98)

随笔档案(74)

相册

收藏夹(19)

MY BLOG

公司主页

情侣BLOG

友情链接

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜