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 ответов
проблема следующая:
SQLCLR не разрешает доступ к данным внутри TestFillRow
-
даже если он" выглядит "как ваш TestFillRow не имеет доступа к данным, способ компилятора переводит код с помощью операторов" yield", фактически откладывая его выполнение до первого .MoveNext () вызов итератора. Поэтому следующее утверждение:
using (SqlConnection con = new SqlConnection("context connection=true"))
выполняется внутри
TestFillRow
... какой незаконный.
не используйте возврата; вместо этого загрузите весь результат в List<>
и верните список в конце функции UD.
" SQLCLR не разрешает доступ к данным внутри TestFillRow " является ошибкой.
Если вы не используете context connection = true
connetion string вы можете получить доступ к данным внутри FillRow
метод.