Удалите часть этой строки, которая устанавливает значение параметра:
mysqlcmd6.Parameters.Add("@res", MySqlDbType.Int32).Value=HITEM.Text;
Похоже, вы ожидаете, что вы привязаете результат @res
к текстовому полю HITEM
, а это не то, что происходит,HITEM.Text
- это просто строка, и когда вы присваиваете это значение параметру int, вы говорите MySql, что ожидаете, что он сможет проанализировать эту строку в int.
Вместо этого создайте только параметр, например:
mysqlcmd6.Parameters.Add("@res", MySqlDbType.Int32);
Вам также нужно сообщить ADO.Net, что это параметр OUTPUT.Затем проверьте значение параметра после того, как запрос выполняется, назначив значение параметра для HITEM.Text, а не из HITEM.Text:
private void a_KeyDown(object sender, KeyEventArgs e)
{
//You can re-use the *names* of these variables, since their scopes are limited to the method
//You can also stack them to share the same scope block and reduce nesting/indentation
using (var con = new MySqlConnection(connectString))
using (var cmd = new MySqlCommand("thamer1", con))
{
cmd.CommandType = CommandType.StoredProcedure;
// mysqlcmd6.CommandText = "thamer1"; //you already did this in constructor. Don't need to do it again
cmd.Parameters.Add("@main_items_id_", MySqlDbType.Int32).Value = a.Text;
//DON'T assign to the Value, but DO make sure ADO.Net understands this is an OUTPUT parameter
cmd.Parameters.Add("@res", MySqlDbType.Int32).Direction = ParameterDirection.Output;
//wait as long as possible to call Open()
con.Open();
cmd.ExecuteNonQuery();
//Now you can assign **to** HITEM.Text, rather than from it.
HITEM.Text = cmd.Parameters["@res"].Value;
}
//End the scope as soon as possible, so the connection can be disposed faster
// MessageBox.Show("saved");
// GridFill();
}
И вот оноопять же без лишних комментариев:
private void a_KeyDown(object sender, KeyEventArgs e)
{
using (var con = new MySqlConnection(connectString))
using (var cmd = new MySqlCommand("thamer1", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@main_items_id_", MySqlDbType.Int32).Value = a.Text;
cmd.Parameters.Add("@res", MySqlDbType.Int32).Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
HITEM.Text = cmd.Parameters["@res"].Value;
}
}
Еще более эффективная практика - переместить все ваши методы SQL в отдельный класс, от ваших обработчиков событий.Обработчики событий должны вызывать только методы в новом классе, например:
public static class DB
{
private static string connectionString = "...";
public static int thamer(int main_item_id)
{
using (var con = new MySqlConnection(connectString))
using (var cmd = new MySqlCommand("thamer1", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@main_items_id_", MySqlDbType.Int32).Value = main_item_id;
cmd.Parameters.Add("@res", MySqlDbType.Int32).Direction = ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
return (int)cmd.Parameters["@res"].Value;
}
}
}
private void a_KeyDown(object sender, KeyEventArgs e)
{
HITEM.Text = DB.thamer(int.Parse(a.Text)).ToString();
}