SqlFunction не удается открыть контекстное соединение, несмотря на DataAccessKind.Читать

у меня есть проект 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.Читать или SystemDataAccessKind.Читать это обратный вызов для получения данных из FillRow метод табличной функции, или метод проверки типа.

Я не вижу, в чем проблема, функция TestConn имеет DataAccessKind.Read.

кто-нибудь знает о каких-либо других причинах получения этой ошибки?

2 ответов


проблема следующая:

  1. SQLCLR не разрешает доступ к данным внутри TestFillRow

  2. даже если он" выглядит "как ваш TestFillRow не имеет доступа к данным, способ компилятора переводит код с помощью операторов" yield", фактически откладывая его выполнение до первого .MoveNext () вызов итератора. Поэтому следующее утверждение:

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

    выполняется внутри TestFillRow... какой незаконный.

не используйте возврата; вместо этого загрузите весь результат в List<> и верните список в конце функции UD.


" SQLCLR не разрешает доступ к данным внутри TestFillRow " является ошибкой.

Если вы не используете context connection = true connetion string вы можете получить доступ к данным внутри FillRow метод.