2013-08-29 2 views
2

В форме приложения рабочего стола Windows я использую этот код для удаления данных из datagridview и базы данных, я взял один столбец столбца в dataridview, если я нажму на checkbox, строка будет удалена в этот момент из datagridview, но не из базы данных, поэтому, когда я перезагружаю форму, я могу снова увидеть эту строку, где я ошибаюсь?данные не удаляются из базы данных

public partial class EditEngClgList : Form 
    {   
     private OleDbConnection acccon = null; 
     private OleDbDataAdapter da = null; 
     private DataTable dt = null; 
     private BindingSource bs = null; 
     private OleDbCommandBuilder cmdb = null; 


     public EditEngClgList() 
     { 
      InitializeComponent(); 
      try 
      { 
       acccon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"); 
       acccon.Open(); 
      } 
      catch (Exception err) 
      { 
       MessageBox.Show("Error:" + err); 
      } 
      string sql = "Select * From EngColeges order by EngClgID"; 
      da = new OleDbDataAdapter(sql, acccon); 
      cmdb = new OleDbCommandBuilder(da); 

      dt = new DataTable(); 
      da.Fill(dt); 
      bs = new BindingSource(); 
      bs.DataSource = dt; 

      dataGridView1.DataSource = bs; 

      dataGridView1.Columns[1].Visible = false; 
      dataGridView1.Columns[2].HeaderText = "Engineering College Name"; 
      dataGridView1.Columns[3].HeaderText = "Adress"; 
      dataGridView1.Columns[4].HeaderText = "Entrance Type"; 
      dataGridView1.Columns[2].Width = 400; 
     } 

     private void button4_Click(object sender, EventArgs e) 
     { 
      List<int> checkedclg = new List<int>(); 
      DataRow dr; 
      List<int> checkedclgid = new List<int>(); 
      for (int i = 0; i <= dataGridView1.RowCount - 1; i++) 
      { 
       if (Convert.ToBoolean(dataGridView1.Rows[i].Cells["Delete"].Value) == true) 
       { 
        checkedclg.Add(i); 
        checkedclgid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["Delete"].Value)); 
       } 
      } 
      foreach (int k in checkedclg) 
      { 
       dr = dt.Rows[k];    
       dt.Rows[k].Delete(); 
       foreach (int j in checkedclgid) 
       { 
        OleDbCommand oleDbCommand = new OleDbCommand("DELETE FROM EngColeges WHERE EngClgID = @clgID", acccon); 
        oleDbCommand.Parameters.Add("@clgID", OleDbType.Integer).Value = j; 
        oleDbCommand.Prepare(); 
        oleDbCommand.ExecuteNonQuery(); 

       } 
      } 
     } 
+0

Вы уверены, что в случае 'button4_Click' ваш цикл' foreach' запускается? У вас есть что-то в 'checkclg' и' checkedclgid'? Вам может потребоваться вызвать 'dataGridView1.EndEdit();' в событии 'button4_Click'. – NeverHopeless

+0

yes Я получаю 'row ID' в' checkclgid', какая цель 'EndEdit' используется для – Durga

+0

Если gridView находится в режиме редактирования, он заканчивает редактирование и фиксирует любые изменения, внесенные в gridView. – NeverHopeless

ответ

0

Вы должны изменить эту строку:

checkedclgid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["Delete"].Value)); 

к следующему:

checkedclgid.Add(Convert.ToInt32(dataGridView1.Rows[i].Cells["CellInTheInvisible‌​Column"].Value)); 

Поскольку вы преобразовали булевский тип в Int16, а затем вы использовали его в своем запросе для проверки с идентификатором в вашей связанной таблице.

OleDbCommand oleDbCommand = new OleDbCommand("DELETE FROM EngColeges WHERE EngClgID = @clgID", acccon); 

Таким образом, вы должны сохранить идентификатор строк, который вы хотите удалить.

0

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

1
if (Convert.ToBoolean(dataGridView1.Rows[i].Cells["Delete"].Value) == true) 
{ 
    checkedclg.Add(i); 
    checkedclgid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["Delete"].Value)); 
} 

Похоже, что неправильная величина ячейки передается Convert.ToInt16? Вместо столбца ID используется столбец «Удалено».

Также вы можете удалить все строки в одном SQL заявления с помощью предложения where in, например: DELETE FROM table WHERE id IN (1, 2, 3, 4)

+0

так что я должен пройти, чем?и я не хочу удалять все строки, просто хочу удалить выбранные строки. – Durga

+0

Пропустите колонку 'EngClgID'. 'Convert.ToInt16 (dataGridView1.Rows [i] .Cells [" EngClgID "]. Значение)' Что касается только удаления выбранных строк, я имею в виду, что это ваш SQL-запрос, чтобы иметь только идентификаторы строк, которые вы хотите удалить , 'string.Format (" DELETE FROM EngColeges WHERE EngClgID in ({0}) ", string.Join (", ", checkedclgid)). – Hack

+0

Если я передаю 'EngClgID', то как он будет проверять, установлен ли флажок или нет, потому что это можно сделать только путем передачи заголовка столбца заголовка – Durga

0

Все, что сейчас является command. Тебе нужно OleDbDataAdapter и передать command к нему:

... 
da = new OleDbDataAdapter(sql, acccon); 
da.DeleteCommand = oleDbCommand; 

Дополнительная информация: http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.deletecommand.aspx

+0

, где я могу поместить эту строку в свой код? – Durga

+0

Это всего лишь пример. Используйте DataAdapter из select (EditEngClgList) также в удалении или используйте глобальное соединение. И затем передайте DeleteCommand в DataAdapter, как в ссылке, которую я вам дал. –

0

Просто замените эти две строки:

oleDbCommand.Prepare(); 
oleDbCommand.ExecuteNonQuery(); 

С:

da.DeleteCommand = oleDbCommand; 

Ссылки : http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.deletecommand.aspx

+0

его не работает – Durga

+0

Используя свои коды, попробуйте запустить исполняемый файл в C: \ [Путь к проекту] \ bin \ Debug, потому что Visual Studio может перезаписать обновленную базу данных старой базой данных, если вы установили свойство «копировать в базу данных» для своей базы данных "копировать всегда" – PythaLye

1

Insted хранения значения Delete как этот

checkedclgid.Add(Convert.ToInt16(dataGridView1.Rows[i].Cells["Delete"].Value)); 

хранящего Значение primary key column, как это удаляет данные правильно из базы данных Также

checkedclgid.Add(Convert.ToInt32(dataGridView1.Rows[i].Cells["EngClgID"].Value)); 
Смежные вопросы