В вашем коде есть пара ошибок.
Сначала в вашем запросе есть синтаксическая ошибка
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));