Обновление нескольких строк одним и тем же порядковым номером - PullRequest
0 голосов
/ 19 декабря 2018

enter image description here

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

Этоработает для обновления таблицы заказов, но обновление таблицы OrderdDetail не работает.Я хочу обновить все строки с тем же OrderNr.Я получаю значения OrderDetail из dataGridView.Вот мой код:

private void UpdateOrder(int paymentTypes)
{       
        try
        {
            string connstring = ConfigurationManager.ConnectionStrings["Db"].ConnectionString;
            using (OleDbConnection conn = new OleDbConnection(connstring))
            {
                conn.Open(); 
                using (OleDbCommand cmd = new OleDbCommand("UPDATE [Orders] SET Amount = @Amount, Tax = @Tax , ToPay = @ToPay WHERE OrderNr = @OrderNumber", conn))
                {                                             
                    // This First table Orders updating fine
                    cmd.Parameters.AddWithValue("@Amount", txtAmount.Text);
                    cmd.Parameters.AddWithValue("@Tax", txtTax.Text);
                    cmd.Parameters.AddWithValue("@ToPay", txtToPay.Text); 
                    cmd.ExecuteNonQuery();                 

                }
            // Here begin for OrderDetails table and not working to update.
                foreach (DataGridViewRow row in dgvCart.Rows)
                {
                     using (OleDbCommand cmd = new OleDbCommand("UPDATE [OrdersItems] SET OrderNr = @OrderNumber, ProductId = @ProductId, Quantity = @Quantity,  WHERE OrderNr = @OrderNumber AND ProductId = @ProductId", conn))
                    {

                        cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(row.Cells["Quantity"].Value)); 
                        cmd.Parameters.AddWithValue("@OrderNumber", txtOrderNumber.Text);
                        cmd.Parameters.AddWithValue("@ProductId", Convert.ToDecimal(row.Cells["ProductId "].Value));

                         cmd.ExecuteNonQuery();                            
                    }
                }

                MessageBox.Show("Updating successfully !", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);

        }
    }

1 Ответ

0 голосов
/ 19 декабря 2018

В вашем коде есть пара ошибок.

Сначала в вашем запросе есть синтаксическая ошибка

using (OleDbCommand cmd = new OleDbCommand(@"UPDATE [OrdersItems] 
    SET OrderNr = @OrderNumber, ProductId = @ProductId, Quantity = @Quantity,  
    WHERE OrderNr = @OrderNumber AND ProductId = @ProductId", conn))

Перед оператором WHERE стоит запятая, которую необходимо удалить.

Во-вторых, в первом запросе отсутствует параметр для OrderNumber.

Третья точка.В OleDb параметры являются позиционными, даже если вы можете назвать их, вы должны поместить их в том же порядке, в котором они появляются в запросе, и вам нужно поместить их снова, если вы используете их два раза (OrderNumber и ProductID появляются оба в части SETи в ГДЕ)

cmd.Parameters.AddWithValue("@OrderNumber", txtOrderNumber.Text);
cmd.Parameters.AddWithValue("@ProductId", Convert.ToDecimal(row.Cells["ProductId "].Value));
cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(row.Cells["Quantity"].Value)); 
cmd.Parameters.AddWithValue("@OrderNumber", txtOrderNumber.Text);
cmd.Parameters.AddWithValue("@ProductId", Convert.ToDecimal(row.Cells["ProductId "].Value));

Однако вам не нужно обновлять ProductID и OrderNumber.Они не могут измениться, иначе этот запрос не смог найти строки, которые вы хотите обновить.

using (OleDbCommand cmd = new OleDbCommand(@"UPDATE [OrdersItems] 
               SET Quantity = @Quantity
               WHERE OrderNr = @OrderNumber AND ProductId = @ProductId", conn))

только с тремя параметрами в правильном порядке

cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(row.Cells["Quantity"].Value)); 
cmd.Parameters.AddWithValue("@OrderNumber", txtOrderNumber.Text);
cmd.Parameters.AddWithValue("@ProductId", Convert.ToDecimal(row.Cells["ProductId "].Value));
...