【问题标题】:Cannot execute mysql store procedure with out parameter in asp.net无法在asp.net中执行没有参数的mysql存储过程
【发布时间】:2013-08-18 20:19:26
【问题描述】:

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

    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"].Value;

我应该怎么做才能使代码正常工作。我想在 aspx 页面中使用结果的另一件事。像这样的东西:总行数:(来自存储过程的结果)。你有什么建议吗?

【问题讨论】:

    标签: asp.net mysql stored-procedures


    【解决方案1】:

    发生这种情况是因为您的 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/Query 并返回该查询的第一行的第一列(在您的情况下,它将是唯一的列和唯一带有 Count(*) 的行)。

    哦,顺便说一下,在您的 finally 块中,它应该是 conn.Close() 而不是 conn.Clone(),但我认为它是一种简单的类型。

    至于在 ASPX 页面上显示结果 - 有多种方法,具体取决于您希望在何处以及如何显示它。例如,您可以将标签控件添加到页面并执行以下操作:

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

    【讨论】:

    • 如果你在代码之外单独运行查询/sp,你能验证它的结果是什么吗?
    • 另外,只是一个想法,但可能无法从 ExecuteScalar 的 Object 结果直接转换为 int ,请尝试使用int total = Convert.ToInt32(cmd.ExecuteScalar());。我已经用这条线更新了我的答案
    • 当我在 MySQL 中运行存储过程时,我得到了数字 12。我尝试了其他方法,也许不是那么清晰,但现在可以了。对象总数 = (object)cmd.ExecuteScalar();
    • 我已经更新了我的答案,试试Convert.ToInt32 方法。此外,如果您打算将此数字仅用于显示 - 以这种方式将其分配给字符串变量,您将避免双重转换(到 Int 和后来到 String)。如果可能,尽量不要使用对象变量
    • 是的,这次它运行了。现在这是正确答案。谢谢你帮助我:)
    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 2014-09-26
    • 2014-09-30
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多