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

时间:2012-09-26 17:42:36

标签: c# .net sql-server-2005 linq-to-sql stored-procedures

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

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

所需参数会动态变化。

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

3 个答案:

答案 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中获取所有参数。