2

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

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

所需的参数将动态变化。

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

4

3 回答 3

1

如果我的理解正确,那么这篇文章将讲述如何使用可选参数调用 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>了 ,所以它不仅可以包含字符串值,还可以包含任何类型的参数。当然,它们应该反映存储过程的期望。

PS:我在 ms sql 2008 上测试过,我不完全确定,它将如何在 ms sql 2005 上工作

于 2012-09-27T00:17:44.397 回答
0

在 SQL Server 中,参数的数量必须是静态的,因此您将无法为所欲为。

您还有其他一些解决方案:

  • 1:使用 1 个分隔字符串作为参数,然后在存储过程中对参数进行子字符串化。

  • 2:将这 50 个左右的字符串保存在表中(附加到唯一 ID),使用存储过程中的该表(使用唯一 ID 作为唯一参数),然后让存储过程删除这些临时字符串。

于 2012-09-26T17:48:07.077 回答
0

这样做的唯一方法是创建一个 xml 文件并将其发送到您的 proc。您可以获取 sql 中的所有参数。

于 2012-09-26T18:01:19.333 回答