我有一个包含大量参数(> 50)的存储过程,其中绝大多数是可选的。我希望能够这样称呼它:
var result = context.MySproc(
new Dictionary<string, string>()
{
{"foo","bar"},
{"baz","xyzzy"}
});
所需参数会动态变化。
数据库调用必须是存储过程(不是由我决定),并且必须使用现有的DataContext
而不是设置新连接。
答案 0 :(得分:1)
如果我理解正确,那么this文章将告诉如何使用可选参数调用ms sql存储过程。这就是我用它来用LINQ to SQL调用这种存储过程的方式:
1)假设您有一个带有可选参数的存储过程,例如:
CREATE PROCEDURE [dbo].[MyProc]
@arg1 bigint,
@arg2 datetime,
@arg3 decimal(18,2)=null,
@arg4 decimal(18,2)=null,
@arg5 int
BEGIN
...
END
2)你有一些DataContext
使用LINQ to SQL
DataContext dc = new DataContext("Your connection string, for example");
3)存储过程名称
string procName = "dbo.MyProc";
4)Params字典(例如):
Dictionary<string, object> paramList = new Dictionary<string, object>()
{
{"arg1",72},
{"arg2",DateTime.Now.Date},
//arg3 is omitted and should get its default value in stored
{"arg4",250}, proc
{"arg5",777}
};
5)然后你可以使用以下方法:
static int Foo(DataContext dc,
string procName,
Dictionary<string, object> paramList)
{
StringBuilder command = new StringBuilder("EXECUTE ");
command.Append(procName);
int i = 0;
foreach (string key in paramList.Keys)
{
command.AppendFormat(" @{0} = ", key);
command.Append("{");
command.Append(i++);
command.Append("},");
}
return dc.ExecuteCommand(command.ToString().TrimEnd(','),
paramList.Values.ToArray());
}
像这样
//You should add exception handling somewhere, of course, as you need
Foo(dc, procName, paramList);
它将调用您的存储过程。强制参数应始终存在于字典中,否则将失败。可以省略可选参数,然后它们将获得由存储过程本身定义的默认值。
我使用Dictionary<string,object>
,因此它不仅包含字符串值,还包含任何类型的参数。当然,它们应该反映存储过程的期望。
P.S。:我在ms sql 2008上测试过,我不完全确定它是如何在ms sql 2005上运行的
答案 1 :(得分:0)
在SQL Server中,参数的数量必须是静态的,因此您将无法执行所需的操作。
您还有其他一些解决方案:
1:使用1分隔的字符串作为参数,然后在存储过程中对参数进行子串。
2:将这些50个左右的字符串保存在表中(附加到唯一ID),使用存储过程中的该表(使用唯一ID作为唯一参数),然后使存储过程删除那些临时字符串。
答案 2 :(得分:0)
执行此操作的唯一方法是创建一个xml文件并将其发送到您的proc。您可以在sql中获取所有参数。