2012-09-26 34 views
2

我有一个大量的参数(> 50),其中绝大多数是可选的存储过程。我想能够这样称呼它:如何将字符串命名参数发送到存储过程?

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

所需的参数会动态变化。

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

+0

我真诚地感谢如果你能发表评论说,如果我的工作方式为你或不。我在另一种编程语言中完成了类似的任务,只是想知道是否适用于C#的相同方法,通过Linq to SQL – horgh

回答

1

如果我理解正确的你,比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

0

在SQL Server中,参数的数量必须是静态的,所以你将无法做到你想要的。

你有一些其他的解决方案:

  • 1:使用1分隔字符串作为参数,然后串在你的存储过程的参数。

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

相关问题