SqlFunction не может открыть контекстное соединение, несмотря на наличие DataAccessKind. - PullRequest
10 голосов
/ 26 февраля 2009

У меня есть проект SqlServer с очень простым тестом для Table-Valued-Function: -

[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.

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

Ответы [ 2 ]

14 голосов
/ 14 июня 2009

Проблема заключается в следующем:

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

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

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

    исполняется внутри TestFillRow ... что недопустимо.

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

1 голос
/ 13 июля 2014

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

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

...