如果我理解正确的你,比this是文章讲述如何调用一个MS SQL存储过程与可选参数。这是我用它与LINQ调用这种存储过程到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)你必须使用LINQ to一些DataContext
SQL
DataContext dc = new DataContext("Your connection string, for example");
3)存储过程的名称
string procName = "dbo.MyProc";
4)PARAMS dictio中进制(例如):
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>
,所以它可能不仅包含字符串值,而且包含任何类型的参数。当然,他们应该反映存储过程的期望。
PS:我在MS测试SQL 2008,我不能完全肯定,怎么会工作在MS SQL 2005
我真诚地感谢如果你能发表评论说,如果我的工作方式为你或不。我在另一种编程语言中完成了类似的任务,只是想知道是否适用于C#的相同方法,通过Linq to SQL – horgh