gpt4 book ai didi

c# - 如何将以字符串命名的参数发送到存储过程?

转载 作者:太空宇宙 更新时间:2023-11-03 13:54:49 31 4
gpt4 key购买 nike

我有一个包含大量参数(>50)的存储过程,其中绝大多数是可选的。我希望能够这样调用它:

var result = context.MySproc(
new Dictionary<string, string>()
{
{"foo","bar"},
{"baz","xyzzy"}
});

所需的参数会动态变化。

数据库调用必须是一个存储过程(由我决定),并且它必须使用现有的 DataContext 而不是建立一个新的连接。

最佳答案

如果我没理解错的话,那就是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> ,因此它可能不仅包含字符串值,还包含任何类型的参数。当然,它们应该反射(reflect)存储过程的期望。

P.S.: 我在 ms sql 2008 上测试过,我不完全确定它在 ms sql 2005 上的效果如何

关于c# - 如何将以字符串命名的参数发送到存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607393/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com