2016-05-04 3 views
1

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

Database duplicate image

Datagridview display

Может кто-нибудь сказать мне, что проблема в моем коде, пожалуйста?

Мой код

 private void btnPay_Click(object sender, EventArgs e) 
    { 

      decimal pay, balance, total; 


      total = decimal.Parse(txtNetTotal.Text); 

      pay = decimal.Parse(txtCash.Text); 

      balance = pay - total; 

      txtCash.Text = pay.ToString("0.00"); 
      txtBalance.Text = balance.ToString("0.00"); 


     try 
     { 

      foreach (DataGridViewRow row in dgvOrder.Rows) 
      { 
       SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ConnectionString); 
       SqlCommand cmd = new SqlCommand("insert into tblOrder (ProductName,Quantity,ProductPrice,TotalPrice,Cash,Balance)" + 
               "values (@ProductName,@Quantity,@ProductPrice,@TotalPrice,@Cash,@Balance)", con); 
       cmd.Parameters.AddWithValue("@ProductName", Convert.ToString(row.Cells["colProduct"].Value)); 
       cmd.Parameters.AddWithValue("@Quantity", Convert.ToString(row.Cells["colQuantity"].Value)); 
       cmd.Parameters.AddWithValue("@ProductPrice", Convert.ToString(row.Cells["colPrice"].Value)); 
       cmd.Parameters.AddWithValue("@TotalPrice", txtTotal.Text.Trim()); 
       cmd.Parameters.AddWithValue("@Cash", txtCash.Text.Trim()); 
       cmd.Parameters.AddWithValue("@Balance", txtBalance.Text.Trim()); 

       con.Open(); 
       cmd.ExecuteNonQuery(); 
       con.Close(); 
      } 
     } 
     catch(SqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

Здесь весь код для события кнопки.

+0

где написано этот код и исполняется? может быть, этот метод называется дважды! – techspider

+1

Когда вы отлаживаете это, сколько раз этот цикл повторяется? Включает ли 'dgvOrder.Rows' строку, которую вы не ожидаете? – David

+0

Есть два ряда в вашем datagrid? hint-foreach (строка DataGridViewRow в dgvOrder.Rows) –

ответ

2

Основываясь на комментариях выше и на изображении, отредактированном в вопрос, у вашего DataGridView есть два строк. Именно поэтому этот цикл вставка два строки в базу данных:

foreach (DataGridViewRow row in dgvOrder.Rows) 

Похоже, что вторая строка является пустым один, что объясняет, почему второй элемент базы данных имеет только статические значения, а не row- основанные на значениях. Чтобы предотвратить это, вы должны быть в состоянии добавить простое условное:

foreach (DataGridViewRow row in dgvOrder.Rows) 
{ 
    if (!row.IsNewRow) 
    { 
     // insert into the database 
    } 
} 

Или, если вложенные блоки кода неприглядный:

foreach (DataGridViewRow row in dgvOrder.Rows) 
{ 
    if (row.IsNewRow) 
     continue; 
    // insert into the database 
} 
+0

этот код делает трюк. Спасибо д. В базе данных нет дубликатов данных. – NewbieLearner

Смежные вопросы