2016-05-04 12 views
1

ボタンをクリックした後にデータグリッド値とテキストボックスを同時に挿入しようとしましたが、データがデータベースに複製されました。データベースにデータが重複しています

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

これを防ぐために、あなたは簡単な条件を追加することができるはずですか?このメソッドは2回呼ばれることがあります! – techspider

+1

これをデバッグすると、このループは何度反復されますか? 'dgvOrder.Rows'にはあなたが期待していない行が含まれていますか? – David

+0

あなたのDataGridに2つの行がありますか? hint-foreach(dgvOrder.RowsのDataGridViewRow行) –

答えて

2

上記のコメントと質問に編集された画像に基づいて、DataGridViewの2つの行を持っています。このループは、データベースに行を挿入されている理由である:

foreach (DataGridViewRow row in dgvOrder.Rows) 

第二行は第二のデータベースエントリのみ静的な値ではなく行優先を有している理由を説明ブランク一つであるように見えベース値。ネストされたコードブロックは見苦しいであれば、

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

関連する問題