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

时间:2014-07-16 19:17:20

标签: c# sqlclr

这将返回datareader,但方法类型为void。如何从方法中获取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
       }
   }

1 个答案:

答案 0 :(得分:0)

您无法使用ExecuteAndSend()获取数据。为了将数据返回给应用程序,您需要打开SqlConnection,使用该SqlConnection创建SqlCommand,并调用SqlCommand.ExecuteReader或SqlCommand.ExecuteScalar。

另一方面,这个问题含糊不清。创建CLR存储过程的原因是将此CLR作为存储过程执行。从这个意义上讲,它不会向应用层发送任何数据,因为它是由T-SQL调用的,而不是由应用层调用。

话虽如此,由于此处的目标是简单地执行SELECT OID, Name FROM State查询,因此绝对没有理由通过SQLCLR执行此操作。只需在应用层中执行常规SqlCommand即可运行该简单查询或执行封装该查询的常规T-SQL proc。在任何一种情况下,您都将获得一个结果集,因此您可以调用SqlCommand.ExecuteReader()来获取这些结果。这个操作是一个非常直接的来自DB的SELECT,不应该过于复杂的SQLCLR。

附注:

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