CLR存储过程返回SqlDataReader,但方法类型为空

本文关键字:方法 类型 存储过程 返回 SqlDataReader CLR | 更新日期: 2023-09-27 18:13:11

这将返回数据阅读器,但方法类型是空的。如何从方法中获得SqlDataReader值来修改它在业务层?

    [SqlProcedure]
    public static void GetStates() // Method
    {
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            StringBuilder StateQuery = new StringBuilder();
            StateQuery.Append("SELECT OID,Name ");
            StateQuery.Append("FROM ");
            StateQuery.Append("State");
            connection.Open();
            SqlCommand command = new SqlCommand(StateQuery.ToString(), connection);
            SqlContext.Pipe.ExecuteAndSend(command); //Return
       }
   }

CLR存储过程返回SqlDataReader,但方法类型为空

不能使用ExecuteAndSend()获取数据。为了将数据返回到应用程序,您需要打开SqlConnection,使用该SqlConnection创建SqlCommand,然后调用SqlCommand。ExecuteReader或SqlCommand.ExecuteScalar.

另一方面,这个问题是模棱两可的。创建CLR存储过程的原因是将CLR作为存储过程执行。在这个意义上,它不会发送任何数据到应用程序层,因为它是由T-SQL调用的,而不是由应用程序层调用的。

也就是说,由于这里的目标是简单地执行SELECT OID, Name FROM State查询,因此绝对没有理由通过SQLCLR执行此操作。只需在应用程序层执行常规的SqlCommand来运行该简单查询或执行封装该查询的常规T-SQL进程。在任何一种情况下,您都将获得一个结果集,因此您可以调用SqlCommand.ExecuteReader()来获得这些结果。这个操作是一个非常直接的数据库SELECT操作,使用SQLCLR不应该过于复杂。

指出:

  • CLR存储过程的返回类型不需要为空。过程,T-SQL和CLR,可以返回INT/Int32类型。
  • SqlContext。Pipe主要用于发送信息(要执行的查询、作为结果集的一部分显示的结果或[在SSMS的messages选项卡中显示的]消息)。