问题描述
||
我们有一个ASP.NET 2.0应用程序,它大量使用企业库数据访问应用程序块。总之,有一个帮助程序例程,该例程接受SP的参数数组以及SP的名称,然后调用该SP。如此有效
object[] parameters = string.IsNullOrEmpty(paramsString) ? null : jss.Deserialize<object[]>(paramsString);
DbCommand procProcess = Database.GetStoredProcCommand(_storedProc,parameters);
我们也有很多存储过程依赖于参数的默认值。通常,这些具有默认值的参数始终位于存储的proc定义的末尾,例如
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));