0

Sql Serverが返すために使用するこの単純なC#コードがありますTVF

[SqlFunction(FillRowMethodName = "FillRow3")]
public static IEnumerable GetCsv(string csv)
{
    string[] arr = csv.Split(',');
    return arr;
}

public static void FillRow3(Object obj, out int val, out int index)
{
    val = int.Parse((string)obj) ;
    index =  ??? <----------?
}

Hoever - 2 つの列を持つテーブルを返したい: ( val,index)

に従って各行、そのインデックス(0ベース)を返すにはどうすればよいですかarr

(objは のですarr。)

ps -メソッドMyItemに [value,index] を含む配列を作成できますGetCsv
そして - obj 行 (val+index) がFillRow3メソッドに表示されます。しかし、私はそれをしたくありません。

4

2 に答える 2

0

私はそれを解決しました。

でカウンターを作成したかった:

public static void FillRow3(Object obj, out int val, out int index)
{

}

しかし、それは static でなければなりません。

だから私は静的フィールドを作成しようとしました:

public static   int g = 0;
public static void FillRow2(Object obj, out int val, out int index)
{
    val = (int.Parse((string) obj)*2);
    int h = g;
   index = h++;
}

しかし、SQLは叫んだ:

安全なアセンブリ 'MyDll2' の型 'Class1' に静的フィールド 'g' があるため、CREATE ASSEMBLY が失敗しました。セーフ アセンブリ内の静的フィールドの属性は、Visual C# では readonly、Visual Basic では ReadOnly、Visual C++ および中間言語では initonly としてマークする必要があります。

しかし、私が持っている場合readonly int- 私はそれを変更することはできません.

そこで、その へのラッパー参照オブジェクトを作成しましたint

参照は変更されず、Int変更されます... :)

したがって、私の最終的な解決策は次のとおりです。

 

  public class MyCounter
    {
        public  int cnt;
    }  


    public static readonly MyCounter mc = new MyCounter();

    public static void FillRow2(Object obj, out int val, out int index)
    {
        val = (int.Parse((string) obj)*2);

        index = mc.cnt++;
    }

と..................

ここに画像の説明を入力

于 2012-08-04T18:41:20.023 に答える
0

次のようになります。

[SqlFunction(FillRowMethodName = "FillRow3")]
public static IEnumerable GetCsv(string csv)
{
    string[] arr = csv.Split(',');
    return arr.Select((x, i) => Tuple.Create(x, i));
}

public static void FillRow3(Object obj, out string val, out int index)
{
    var input = (Tuple<string, int>)obj;
    val = input.Item1;
    index = input.Item2;
}

静的変数は必要ないことに注意してください。SQL Server 内の静的な状態が問題であると思わない場合は、この問題を調査してください。

于 2012-08-04T22:15:20.760 に答える