我有一个SqlServer项目,对Table-Value-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
。
任何人都知道出现此错误的其他原因吗?
答案 0 :(得分:14)
问题如下:
SQLCLR不允许在TestFillRow中进行任何数据访问
即使它“看起来”像你的TestFillRow不能访问数据,编译器使用“yield”语句转换代码的方式实际上是将它的执行推迟到第一次.MoveNext()调用迭代器。因此以下声明:
using (SqlConnection con = new SqlConnection("context connection=true"))
在TestFillRow
内执行......这是非法的。
不要使用收益率回报;而是将整个结果加载到List<>
并返回UD函数末尾的列表。
答案 1 :(得分:1)
&#34; SQLCLR不允许在TestFillRow内部进行任何数据访问&#34;是一个错误。
如果您不使用context connection = true
连接字符串,则可以访问FillRow
方法中的数据。