无法在asp.net中使用out参数执行mysql存储过程

时间:2013-08-18 20:19:26

标签: asp.net mysql stored-procedures

我有这个存储过程没有参数

    DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_count_rows`(OUT total int)  
BEGIN
    SELECT COUNT(*)   
    FROM address_book.persons;  
END

我想在asp.net页面中使用它。我写下这段代码:

        string commandText = "usp_count_rows";
    MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["mySqlString"].ConnectionString);
    MySqlCommand cmd = null;

    try
    {

        cmd = new MySqlCommand(commandText, conn);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("total", MySqlDbType.Int32);
        cmd.Parameters["total"].Direction = ParameterDirection.Output;

        conn.Open();
        cmd.ExecuteNonQuery();
        int total = (int)cmd.Parameters["?total"].Value;

    }
    catch (MySqlException ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        conn.Clone();
    }

我收到此错误消息

  

指定的演员表无效。

该行

  

int total =(int)cmd.Parameters [“?total”]。值;

我应该怎么做才能使代码工作。另外我想要的是在aspx页面中使用结果。这样的事情:总行数:(来自商店程序的结果)。你有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您的SP不会返回任何参数,只是查询的结果。对于这样的存储过程,您不需要任何参数 - 甚至是输出参数,因此重新定义您的SP简单

CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_count_rows`
BEGIN
    SELECT COUNT(*)   
    FROM address_book.persons;  
END

然后在你C#摆脱行(完全删除它们):

cmd.Parameters.Add("total", MySqlDbType.Int32);
cmd.Parameters["total"].Direction = ParameterDirection.Output;

并替换这些行:

cmd.ExecuteNonQuery();
int total = (int)cmd.Parameters["?total"].Value;

这一行:

int total = Convert.ToInt32(cmd.ExecuteScalar());

ExecuteScalar方法执行您的SP /查询并返回该查询第一行的第一列(在您的情况下,它将是唯一的列和唯一具有Count(*)的行)。

哦,顺便说一句,在你的Finally块中它应该是conn.Close()而不是conn.Clone(),但我觉得它很简单。

至于在ASPX页面上显示结果 - 有多种方式取决于您想要显示它的位置和方式。例如,您可以向页面添加Label控件并执行以下操作:

Label1.Text = "Total number of rows: " + total.ToString();