Ошибка в преобразовании числовых значений

Sql Table : stocks

Colomn Name    |  Data Type
------------------------------
Stock_no       |  nvarchar(15)
Quantity       |  int 
Gem.Weight     |  float
Cost           |  decimal(18,2)

Код бланка моей акции:

private void stocks_Click(object sender, EventArgs e)
{
    try
    {
        cmd = new SqlCommand("INSERT INTO Stocks VALUES('" + txt_stock_no.Text + "', '"
             + txt_qty.Text + "','" + txt_gem_weight.Text + "', '" + txt_cost.Text + "')", conn);

        MessageBox.Show("You've inserted successfully!", "Successful Message", MessageBoxButtons.OK, MessageBoxIcon.Information);                 
        conn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Я думаю, что ошибка должна быть с моим '.text' имеет проблемы.. Я пытался внести изменения с ним, хотя он не работает.

2 ответа

Решение
  • Не вставляйте значения непосредственно из текстовых полей, ваш код уязвим для SQL-инъекций таким образом.

  • Вы должны проверить пользовательские данные для этих значений из текстовых полей. Например, текстовое поле txt_stock_no должны разрешать только целочисленные значения.

  • Было бы лучше перечислить также имена столбцов в операторе вставки, а не только значения, если вы пропустили или забыли их порядок. а также для удобочитаемости.

  • Затем используйте параметризованные запросы.

Что-то вроде этого:

string commandText = "INSERT INTO Stocks VALUES(@stock_no, @txt_qty,@txt_gem_weight,@txt_cost)";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@stock_no", SqlDbType.Int);
    command.Parameters["@stock_no"].Value = txt_stock_no.Text;

    ....
    // do the same for other parameters
}

Обновление::

SqlCommand command = new SqlCommand(commandText, conn);
command.Parameters.Add("@stock_no", SqlDbType.Int);
command.Parameters["@stock_no"].Value = txt_stock_no.Text;

....
// do the same for other parameters

Замените ваш код следующим:

cmd = new SqlCommand("INSERT INTO Stocks VALUES('" + txt_stock_no.Text + "', "+ txt_qty.Text + "," + txt_gem_weight.Text + "," + txt_cost.Text + ")", conn);
int rowseffected=cmd.ExecuteNonQuery();
//rest of your code goes here...

Однако это не рекомендуется. Этот запрос уязвим для внедрения SQL. Вместо этого используйте параметры, и вы больше не столкнетесь с такой проблемой.

Другие вопросы по тегам