企业数据应用程序块、存储过程和具有默认值的参数



我们有一个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));

最新更新