我们有一个ASP.NET 2.0应用程序,它大量使用企业库数据访问应用程序块。有一个助手例程,简而言之,它接受SP的一组参数以及SP的名称,并调用该SP。因此,非常有效
object[] parameters = string.IsNullOrEmpty(paramsString) ? null : jss.Deserialize<object[]>(paramsString);
DbCommand procProcess = Database.GetStoredProcCommand(_storedProc, parameters);
我们还有许多存储过程依赖于参数的默认值。通常,这些具有默认值的参数总是在存储过程定义(如)的末尾
CREATE PROCEDURE MyProc
@param1 int
,@param2 int
,@param3 int = 0
AS
....
我希望能够通过只传递param1和param2的值来调用proc。当然,如果我的参数只有两个参数,那么这个调用
DbCommand procProcess = Database.GetStoredProcCommand(_storedProc, parameters);
仍将带回param3,但不会为其指定默认值。因此调用
procProcess.ExecuteNonQuery();
将失败。
有人能帮助我省略这些指定了默认值的参数吗?或者以某种方式向它们传递与关键字"default"等效的SQL?
我自己解决了这个问题。基本上,我重构了代码,以接受参数的对象数组,然后将其传递给
DbCommand procProcess = Database.GetStoredProcCommand(_storedProc, parameters);
调用或接受自定义类的数组的序列化表示,该表示只列出参数名称及其值。然后,代码反序列化这个传入的自定义类数组,并执行类似的操作
DbCommand procProcess = Database.GetStoredProcCommand(_storedProc);
for (int i = 0; i < typedparams.Length; i++)
procProcess.Parameters.Add(new SqlParameter(typedparams[i].ParamName.StartsWith("\@") ? typedparams[i].ParamName : "@" + typedparams[i].ParamName, typedparams[i].ParamValue));