2

多数のパラメーター(> 50)を持つストアドプロシージャがあり、その大部分はオプションです。私はそれをこのように呼ぶことができるようにしたいと思います:

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

必要なパラメータは動的に変化します。

DB呼び出しは(私ではなく)ストアドプロシージャである必要がありDataContext、新しい接続を設定するのではなく、既存のプロシージャを使用する必要があります。

4

3 に答える 3

1

私があなたを正しく理解していれば、これはオプションのパラメータを使用してmssqlストアドプロシージャを呼び出す方法を説明する記事です。そして、これは私がLINQ toSQLでそのようなストアドプロシージャを呼び出すためにそれを使用した方法です:

1)次のようなオプションのパラメータを持つストアドプロシージャがあるとします。

CREATE PROCEDURE [dbo].[MyProc] 
    @arg1 bigint,
    @arg2 datetime,
    @arg3 decimal(18,2)=null,
    @arg4 decimal(18,2)=null,
    @arg5 int
BEGIN
...
END

2)DataContextLINQtoSQLを使用しているものがあります

DataContext dc = new DataContext("Your connection string, for example");

3)ストアドプロシージャ名

string procName = "dbo.MyProc";

4)パラメータ辞書(例):

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でテストしましたが、mssql2005でどのように機能するか完全にはわかりません。

于 2012-09-27T00:17:44.397 に答える
0

これを行う唯一の方法は、xmlファイルを作成してprocに送信することです。SQL内のすべてのパラメータをフェッチできます。

于 2012-09-26T18:01:19.333 に答える
0

SQL Server では、パラメーターの数は静的でなければならないため、必要なことを行うことはできません。

他にもいくつかの解決策があります:

  • 1: 1 つの区切り文字列をパラメーターとして使用し、ストアド プロシージャでパラメーターをサブストリング化します。

  • 2: これらの 50 個程度の文字列を (一意の ID に関連付けられた) テーブルに保存し、ストアド プロシージャからそのテーブルを使用し (一意の ID を唯一のパラメータとして使用)、ストアド プロシージャでこれらの一時的な文字列を削除します。

于 2012-09-26T17:48:07.077 に答える