параметр «@xxx » уже объявлен

#c# #mysql #.net #database-connection

Вопрос:

Здесь я пытаюсь обновить детали в своей базе данных mysql, но она не обновляет детали, а показывает, что сделано. После этого, если я попытаюсь обновить то же самое, он покажет, что параметр «@Уникальный идентификатор » уже объявлен.

Ниже приведен раздел моей кнопки обновления приложения, которое я создаю.

 private void btn_Update_Click(object sender, EventArgs e)
{
    sqlConn.ConnectionString = "Server = "   server   ";"   "user Id = "   username   ";"   "password  = "   password   ";"   "database = "   database;
    
    
    try
    {
        MySqlCommand sqlcmd = new MySqlCommand();
        sqlConn.Open();
        sqlCmd.Connection = sqlConn;
        sqlCmd.CommandText = "Update `monthly_expense`.`exp_mast` set `Unique ID`= '@Unique ID', `First Name`=  '@First Name',`Last Name`= '@Last Name',`Address`= '@Address',`Contact Number`= '@Contact Number',`Alternate Contact Number`= '@Alt Number',`Gender`= '@gen' Where(`Unique ID`= '@Unique ID')";
        if (rb_male.Checked == true)
        {
            gen = "Male";
        }
        else
        {
            gen = "Female";
        }
        sqlCmd.CommandType = CommandType.Text;
        sqlCmd.Parameters.AddWithValue("@Unique ID", txt_id.Text);
        sqlCmd.Parameters.AddWithValue("@First Name", txt_fstn.Text);
        sqlCmd.Parameters.AddWithValue("@Last Name", txt_lstn.Text);
        sqlCmd.Parameters.AddWithValue("@Address", txt_loc.Text);
        sqlCmd.Parameters.AddWithValue("@Contact Number", txt_cont.Text);
        sqlCmd.Parameters.AddWithValue("@Alt Number", txt_altcont.Text);
        sqlCmd.Parameters.AddWithValue("@gen", gen);

        sqlCmd.ExecuteNonQuery();
        sqlConn.Close();
        MessageBox.Show("Done");
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
 

Комментарии:

1. MySqlCommand sqlcmd = new MySqlCommand(); объявляет sqlcmd (все в нижнем регистре), тогда как все остальное в методе использует sqlCmd (прописные буквы C). Это наводит меня на мысль, что вы объявили sqlCmd в другом месте (где — то, что сохраняется между вызовами этого раздела кода-возможно, в качестве переменной поля в классе?) и поэтому добавляете в него параметры снова и снова и снова. В любом случае, VTC как опечатка.

2. MySqlCommand sqlcmd = new MySqlCommand(); также было объявлено во всем мире

3. Да, но sqlcmd in btn_Update_Click имеет приоритет над «глобальным» sqlcmd .

4. В случае, если мой предыдущий комментарий был неясен: C# чувствителен к регистру, поэтому sqlcmd и sqlCmd в коде btn_Update_Click не ссылайтесь на одну и ту же переменную.

5. Ваш код выглядит правильно, и выполнение также не вызывает никаких ошибок… так что это, должно быть, проблема с данными… возможно, вам захочется проверить правильность введенных значений text_id … кроме того, вы можете запустить тот же запрос в workbench и посмотреть, обновит ли он значение в таблице. Все остальные запросы на обновление/вставку в приложении работают нормально?