从 MySQL 数据库中选择数据时,PROCEDURE 的参数数量不正确

Posted

技术标签:

【中文标题】从 MySQL 数据库中选择数据时,PROCEDURE 的参数数量不正确【英文标题】:Incorrect Number of Arguments for PROCEDURE when selecting data from MySQL database 【发布时间】:2021-07-14 12:10:29 【问题描述】:

我正在尝试将包含 SQL 查询的 c# 方法转换为对存储过程的调用。该方法在查询应用程序端正常工作,但我收到错误Incorrect Number of Arguments for PROCEDURE dat.checkUsernameSetup; expected 1, got 0。我不确定为什么会这样。

这是转换之前的代码:

public bool CheckUsername()

    try
    
        mysqlCommand cmd = new MySqlCommand("SELECT * From `tbl_user` WHERE `username` = @uname;", Conn);
        DataTable table = new DataTable();
        MySqlDataAdapter adapter = new MySqlDataAdapter();
        /*cmd.CommandType.Equals(CommandType.StoredProcedure);*/
        cmd.Parameters.AddWithValue("@uname", usernameField.Text);
        adapter.SelectCommand = cmd;
        adapter.Fill(table);

        if (table.Rows.Count > 0)
        

            return true;
        
        else
        

            return false;
        
    
    catch (Exception ex)
    
        MessageBox.Show(ex.Message);
        return false;
    

下面是后面的代码:

    public bool CheckUsername()
    
        try
        
            using (MySqlCommand cmd = new MySqlCommand("checkUsernameSignUp", Conn))
            
                cmd.CommandType.Equals(CommandType.StoredProcedure);
                DataTable table = new DataTable();
                MySqlDataAdapter adapter = new MySqlDataAdapter();
                
                cmd.Parameters.AddWithValue("@uname", usernameField.Text);
                adapter.SelectCommand = cmd;
                adapter.Fill(table);

                if (table.Rows.Count > 0)
                

                    return true;
                
                else
                

                    return false;
                
            
        
        catch (Exception ex)
        
            MessageBox.Show(ex.Message);
            return false;
        
    

这是我的存储过程:

drop procedure if exists checkUsernameSignUp; 
delimiter //
create procedure checkUsernameSignUp(IN `uname` varchar(100))
    BEGIN
        SELECT username From `tbl_user` WHERE `username` = uname;
        COMMIT;
    END//
delimiter ;   

我该如何解决这个错误?

注意: Conn 引用了我的连接字符串

【问题讨论】:

【参考方案1】:

你的错误在这里:

cmd.CommandType.Equals(CommandType.StoredProcedure);

应该是:

cmd.CommandType = CommandType.StoredProcedure;

原因是Equals 是一个返回bool 以指示它们是否相等的方法。您的代码有效地将cmd.CommandType 的当前值与CommandType.StoredProcedure 进行比较并丢弃结果。

【讨论】:

这很奇怪,在某些方法中我的做法是有效的,但是这种方法似乎不起作用,并且按照你说的方式起作用 @johnny 在其他方法中,您是使用标准 SQL 查询还是使用存储过程? cmd.CommandType (CommandType.Text) 的默认值适用于标准 SQL 查询,因为它适用于文本查询。 这里是一个可以工作的例子 Conn.Open();尝试 MySqlCommand cmd = new MySqlCommand("GetPlayerUsernames", Conn); cmd.CommandType.Equals(CommandType.StoredProcedure); MySqlDataReader 阅读器 = cmd.ExecuteReader(); while (reader.Read()) playerComboBx.Items.Add(reader.GetString("username")); catch (Exception ex) MessageBox.Show(ex.Message); Conn.Close(); 啊,这看起来是因为你实际上并没有传递任何参数。 鉴于您的回复,我假设这个可行,因为它是公共 void 而不是公共布尔

以上是关于从 MySQL 数据库中选择数据时,PROCEDURE 的参数数量不正确的主要内容,如果未能解决你的问题,请参考以下文章

MySQL nodejs 在从大表中选择数据时崩溃

从 mysql 网站检索时未选择数据库

从 mysql 选择中排除空数据

当php函数从mysql数据值中选择时,“未定义的变量”

从 PHP 数组中选择 MYSQL 数据

从 mysql 数据库查询中使用 php 时加快 csv 导出