Skip to content
Advertisement

Incorrect number of arguments for PROCEDURE… from C#

I am having trouble using parameters in a stored procedure. I believe I am not passing the parameters in correctly with the C#.

My code is roughly equivalent to:

public static string GetCustomer(string storedProcedure, string connectionString)
{
    DataTable dt = new DataTable();
    using (MySqlConnection con = new MySqlConnection(connectionString))
    {
        using (MySqlCommand cmd = new MySqlCommand(storedProcedure, con))
        {
            cmd.Parameters.AddWithValue("_table1", "table1");
            cmd.Parameters.AddWithValue("_table2", "table2");

            con.Open();
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            IDataParameter[] temp = da.GetFillParameters();//returns 2 parameters
            da.Fill(dt);//Breaks here with the error below

            //Irrelevant code
        }
    }
    return "";
}

Incorrect number of arguments for PROCEDURE tspos.get_customer; expected 2, got 0

DROP PROCEDURE IF EXISTS get_customer;
DELIMITER //
CREATE PROCEDURE get_customer
(
    IN _table1 VARCHAR(25),
    IN _table2 VARCHAR(25)
)
BEGIN
SET @t1 = CONCAT('SELECT a.*, b.* FROM ', _table1, ' a, ', _table2, ' b');
    PREPARE statement FROM @t1;
    EXECUTE statement;
    DEALLOCATE PREPARE statement;
END //

DELIMITER ;

The calls below work as expected, so I would imagine my issue is in the C#

CALL get_customer('table1', 'table2');
CALL get_customer('table3', 'table4');

Advertisement

Answer

I believe the name of your parameters should be prefixed with an @ sign:

cmd.Parameters.AddWithValue("@_table1", "table1");
cmd.Parameters.AddWithValue("@_table2", "table2");

Also, make sure to set the command type appropriately:

using (MySqlConnection con = new MySqlConnection(connectionString))
{
    using (MySqlCommand cmd = new MySqlCommand(storedProcedure, con))
    {
        //Set command type
        cmd.CommandType = CommandType.StoredProcedure;
        con.Open();
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        
        cmd.Parameters.AddWithValue("@_table1", "table1");
        cmd.Parameters.AddWithValue("@_table2", "table2");
        
        IDataParameter[] temp = da.GetFillParameters();//returns 2 parameters
        da.Fill(dt);

        //Irrelevant code
    }
}
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement