尽管DataAccessKind.Read存在,但SqlFunction无法打开上下文连接

时间:2009-02-26 16:01:49

标签: c# .net sql-server sqlclr user-defined-functions

我有一个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

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

2 个答案:

答案 0 :(得分:14)

问题如下:

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

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

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

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

  3. 不要使用收益率回报;而是将整个结果加载到List<>并返回UD函数末尾的列表。

答案 1 :(得分:1)

&#34; SQLCLR不允许在TestFillRow内部进行任何数据访问&#34;是一个错误。

如果您不使用context connection = true连接字符串,则可以访问FillRow方法中的数据。