gpt4 book ai didi

c# - 尽管存在 DataAccessKind.Read,SqlFunction 仍无法打开上下文连接

转载 作者:可可西里 更新时间:2023-11-01 09:03:48 24 4
gpt4 key购买 nike

我有一个 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() 的注释,它失败了:-

Data access is not allowed in this context. Either the context is a function or method not marked with DataAccessKind.Read or SystemDataAccessKind.Read, is a callback to obtain data from FillRow method of a Table Valued Function, or is a UDT validation method.

我没看出来是什么问题,TestConn 函数有 DataAccessKind.Read

有人知道出现此错误的任何其他原因吗?

最佳答案

问题如下:

  1. SQLCLR 不允许在 TestFillRow 内部进行任何数据访问

  2. 即使它“看起来”像您的 TestFillRow 不访问数据,编译器翻译带有“yield”语句的代码的方式实际上是将它的执行推迟到迭代器的第一个 .MoveNext() 调用。因此声明如下:

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

    TestFillRow 中执行...这是非法的。

不要使用 yield 返回;而是将整个结果加载到 List<>并在 UD 函数的末尾返回列表。

关于c# - 尽管存在 DataAccessKind.Read,SqlFunction 仍无法打开上下文连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com