2016-08-18 10 views
-2

私はこのコードを何時間も作業していますが、情報が正常に削除されたというメッセージボックスが表示されますが、データベース上では削除されません。データベースから選択された行データを削除します

private void simpleButton5_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < dataGridView1.Rows.Count; i++) 
     { 
      DataGridViewRow delrow = dataGridView1.Rows[i]; 
      if (delrow.Selected == true) 
      { 
       //A YesNo enabled messagebox 
       DialogResult dialogResult = DevExpress.XtraEditors.XtraMessageBox.Show("Are you sure you want delete the selected client's information?", " ", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); 
       //An if statement for a yes selected button on the messagebox 
       if (dialogResult == DialogResult.Yes) 
       { 
        dataGridView1.Rows.RemoveAt(i); 
        try 
        { 
         Conn.Open(); 
         SqlCommand Scd = new SqlCommand("Delete From Client WHERE ClientID=" + i + "" ,Conn); 
         Scd.ExecuteNonQuery(); 
         Conn.Close(); 
         DevExpress.XtraEditors.XtraMessageBox.Show("You have successfully deleted the selected client's information on the system", " ", MessageBoxButtons.OK, MessageBoxIcon.Information); 
        } 
        catch (Exception ex) 
        { 
         DevExpress.XtraEditors.XtraMessageBox.Show(ex.ToString()); 
        } 
        } 
       //An if statement for a no selected button on the messagebox 
       else if (dialogResult == DialogResult.No) 
       { 
        //Closing this form and opening the main menu form 
        this.Hide(); 
        MainMenu mm = new MainMenu(); 
        mm.ShowDialog(); 
        this.Close(); 
        this.Dispose(); 
       } 
      } 
     } 
    } 
+0

ユーザーに提供するデータの表示を実際のデータと組み合わせて使用​​しました。 DataAdapterを使用すると、すべてのコードを取り除くことができます: 'myDA.Update(myDT);' – Plutonix

答えて

4

ClientIDは、おそらくiではありません(これは単なる行インデックスです)。行データから実際のクライアントIDを取得します。

int clientID = (int)dataGridView1.Rows[i].Cells[indexOfClientIDColumn].Value; 
SqlCommand Scd = 
    new SqlCommand("Delete From Client WHERE ClientID=" + clientID , Conn); 

または名前

int clientID = (int)dataGridView1.Rows[i].Cells["ClientID"].Value; 

し、また、より良いcommand parametersを使用することにより、右側の列を取得します。

+0

ありがとう – TheBells

5
"Delete From Client WHERE ClientID=" + i + "" 

あなた= iのClientIDと行を削除します。しかし、何を待つi? forループ内の一時変数。したがって、データグリッドビューにDB内のすべての行が含まれていない場合、IDは1で始まり、IDは他のクライアントのデータを削除するたびに1ずつ増えます。

実際にはWHERE ClientID=" + delrow["ClientID"]などのIDを取得する可能性があります。

しかし、メモとして。あなた自身の好意を持ってParameterized Sqlを使用してSQLインジェクションを防止してください。

2

あなたのループによると、あなたの変数iがrowIndexプロパティであり、常にIMO 0、1、2、3、4 ... nは

になるだろう、私はあなたがそれらとのClientIDを得たとは思いませんClientテーブルの値。同じキー値を持っているかどうかを再度確認できますか?

SqlCommand Scd = new SqlCommand("Delete From Client WHERE ClientID=" + i + "" ,Conn);

あなたの代わりに、クライアントIDとしてデータグリッドの行を渡している:私は、エラーがここにあると考えているあなたが戻ってあなたの「DataGridViewRow」から

2

をクライアントIDを取得する必要があります

実ID。

+0

いいえ、私は実際にコードを修正する方法に関する提案を理解しています – TheBells

関連する問題