10

Table-Valued-Functionの非常に簡単なテストを含むSqlServerプロジェクトがあります:-

[SqlFunction(TableDefinition = "forename nvarchar(50)", FillRowMethodName = "TestFillRow", DataAccess = DataAccessKind.Read)]
public static IEnumerable TestConn(int ID)
{
    using (SqlConnection con = new SqlConnection("context connection=true"))
    {
        //con.Open();
        yield return "Anthony";
    }
}

public static void TestFillRow(object obj, out string forename)
{
    forename = (string)obj;
}

接続のオープンは現在コメントアウトされていることに注意してください。デプロイしたら、SQLで次のように実行できます:-

SELECT * FROM [dbo].[TestConn](1)

すべて正常に動作します。

今、私はコメントを外し、con.open()それは次のように失敗します:-

このコンテキストでは、データアクセスは許可されていません。コンテキストは、DataAccessKind.ReadまたはSystemDataAccessKind.Readでマークされていない関数またはメソッドであるか、テーブル値関数のFillRowメソッドからデータを取得するためのコールバックであるか、UDT検証メソッドです。

問題が何であるかわかりません。TestConn関数がありDataAccessKind.Readます。

このエラーが発生する他の理由を知っている人はいますか?

4

2 に答える 2

16

問題は次のとおりです。

  1. SQLCLR は TestFillRow 内のデータ アクセスを許可しません

  2. TestFillRow がデータにアクセスしないように「見える」場合でも、コンパイラが「yield」ステートメントを使用してコードを変換する方法は、イテレータへの最初の .MoveNext() 呼び出しまで実際に実行を延期することです。したがって、次のステートメント:

    using (SqlConnection con = new SqlConnection("context connection=true"))        
    

    内部で実行されTestFillRowます...これは違法です。

yield return を使用しないでください。代わりに、結果全体を a にロードしList<>、UD 関数の最後でリストを返します。

于 2009-06-14T12:54:00.140 に答える
1

「SQLCLR は TestFillRow 内のデータ アクセスを許可しません」は誤りです。

context connection = true接続文字列を使用しない場合は、FillRowメソッド内のデータにアクセスできます。

于 2014-07-12T20:31:39.510 に答える