Как я могу запустить две SQL команды с одним соединением? - PullRequest
1 голос
/ 29 апреля 2020

Мне нужно вставить данные в одну таблицу и обновить идентификатор во второй таблице с помощью кнопки добавления:

private void addButton_Click(object sender, EventArgs e)
{
    con.Open();
    cmd = new SqlCommand("Insert Into Rent(toolId, customerId, custName, Fee, date, dueDate) Values('" + toolIdComboBx.Text + "', '" + custIdTxtBx.Text + "', '" + custNameTxtBx.Text + "', '" + feeTxtBx.Text + "', '" + dateTimePicker2.Text + "', '" + dateTimePicker1.Text + "')", con);

    dr = cmd.ExecuteReader();

    if (dr.Read())
    {
        con.Close();
        con.Open();

        cmd = new SqlCommand("Update Inventory Set Available = 'No' Where ToolId =  = '" + toolIdComboBx.Text + "' ");

        cmd.ExecuteNonQuery();
    }

    con.Close();
    DisplayData();
}

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Я вижу несколько проблем здесь

  1. Всегда, всегда, всегда используйте параметризованные запросы (props to @ broots-waymb) и никогда, никогда не объединяйте пользовательский ввод в команду SQL
  2. Используйте ключевое слово using для автоматической очистки любого объекта с помощью метода Dispose (), который включает в себя SqlConnection и SqlCommand - это обеспечивает правильную очистку при наличии исключений; также проще написать
  3. Использовать ExecuteNonQuery(), если вы не ожидаете возврата набора записей. Как указал @jdweng, единственным запросом, который возвращает набор записей, является оператор SELECT (хранимые процедуры также могут). Смысл Read () в том, что этот код неясен, я предполагаю, что он всегда будет возвращать false
  4. Будьте осторожны, когда ваша схема базы данных содержит одну таблицу (Inventory), состояние которой зависит от состояния другой таблицы ( Арендная плата). Рассмотрите стратегии, чтобы избежать этого, но если вы не можете этого сделать, то вам следует обернуть обновление в обе таблицы в транзакции базы данных, чтобы убедиться, что состояние вашей системы соответствует
1 голос
/ 29 апреля 2020

Невозможно закрыть соединение, если у него открыто SqlDataReader.

Почему вы читаете из оператора INSERT? Что вы ожидаете?

Кроме того, используйте параметризованные запросы.

Обновление

Нет значения результата из INSERT, поэтому используйте ExecuteNonQuery() вместо. Таким образом, соединение доступно для следующего SqlCommand

0 голосов
/ 29 апреля 2020

Спасибо, ребята! Я понял это

con.Open ();

        using (cmd = new SqlCommand("Insert Into Rent(toolId, customerId, custName, 

Fee, date, dueDate) Значения ('"+ toolIdComboBx.Text +"', '"+ custIdTxtBx.Text + "','" +

custNameTxtBx.Text + "','" + feeTxtBx.Text + "','" + dateTimePicker2.Text + "','" +

dateTimePicker1. Текст + "')", con))

        {
            cmd.ExecuteNonQuery();
        }

        using (cmd = new SqlCommand("Update Inventory Set Available = 'No' Where ToolId  = '" + toolIdComboBx.Text + "' ", con))

        {
            cmd.ExecuteNonQuery();
        };

        con.Close();

        DisplayData();
...