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

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

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

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

InBlock.gif
InBlock.gif            
return result;
ExpandedBlockEnd.gif        }

None.gif

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

ExpandedBlockStart.gif ContractedBlock.gif          /**/ /// <summary>
InBlock.gif        
/// 对参数数组赋值
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="commandParameters">参数数组</param>
ExpandedBlockEnd.gif        
/// <param name="parameterValues">对应值数组</param>

None.gif          public   void  AssignParameters(DbParameter[] commandParameters,  object [] parameterValues)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
if ((commandParameters == null|| (parameterValues == null))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return;
ExpandedSubBlockEnd.gif            }

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

InBlock.gif
InBlock.gif            
for (int i = 0, j = commandParameters.Length; i < j; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                commandParameters[i].Value 
= parameterValues[i];
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif
ExpandedBlockEnd.gif        }

None.gif

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

None.gif         [TestMethod]
None.gif        
public   void  SelectPersonBySex()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string sex = "";
InBlock.gif
InBlock.gif            
//创建默认的数据库实例
InBlock.gif
            Database db = DatabaseFactory.CreateDatabase();
InBlock.gif            
string spName = "SelectPersonBySex";
InBlock.gif
InBlock.gif            
//DbCommand dbcomm = db.GetStoredProcCommand(spName);
InBlock.gif
InBlock.gif            
//得到该存储过程的参数数组
InBlock.gif
            DbParameter[] parameters = this.GetDBCommandParameters(db, spName);
ExpandedSubBlockStart.gifContractedSubBlock.gif            
object[] strValues = new object[] dot.gif{ sex };
InBlock.gif            
//对参数数组赋值
InBlock.gif
            this.AssignParameters(parameters, strValues);
InBlock.gif
InBlock.gif            DataSet ds 
= db.ExecuteDataSet(spName, parameters);
InBlock.gif
InBlock.gif            Assert.AreEqual(ds.Tables[
0].Rows.Count,1);
ExpandedBlockEnd.gif        }


Email:pwei013@163.com

转载于:https://www.cnblogs.com/pw/archive/2006/06/12/424131.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值