代码之家  ›  专栏  ›  技术社区  ›  AnthonyWJones

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

  •  10
  • AnthonyWJones  · 技术社区  · 17 年前

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

    SELECT * FROM [dbo].[TestConn](1)
    

    一切正常。

    现在我取消注释 con.open() 它失败于:-

    此数据库中不允许进行数据访问 未标记为的函数或方法 DataAccessKind.Read或 回调以从FillRow获取数据 是一种UDT验证方法。

    我不知道问题出在哪里,TestConn函数 DataAccessKind.Read

    有人知道这个错误的其他原因吗?

    2 回复  |  直到 17 年前
        1
  •  16
  •   Braiam nahurmf    10 年前

    问题如下:

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

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

      TestFillRow

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

        2
  •  1
  •   Jeroen    11 年前

    “SQLCLR不允许在TestFillRow内进行任何数据访问”是一个错误。

    如果你不使用 context connection = true FillRow 方法