2013-09-02 7 views
4

Я использую пейджинг для отображения данных в datagridview, но когда я пытаюсь обновить любые данные с помощью updatebutton, данные должны быть обновлены в datagridview, а также в базе данных.Ошибка: для обновления требуется действительный UpdateCommand при передаче коллекции DataRow с измененными строками

Но я получаю эту ошибку:

Update requires a valid UpdateCommand when passed DataRow collection with modified rows

, который происходит на этой линии:

adp1.Update(dt);//here I am getting error 

Ниже приведен код

public partial class EditMediClgList : Form 
    {   
     public EditMediClgList() 
     { 
      InitializeComponent(); 
      try 
      { 
       con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"); 
       con.Open(); 
      } 
      catch (Exception err) 
      { 
       MessageBox.Show("Error:" +err); 
      } 

      cmd1 = new OleDbCommand("Select * from MedicalColeges order by MedicalClgID", con); 
      ds = new DataSet(); 
      adp1 = new OleDbDataAdapter(cmd1); 
      adp1.Fill(ds, "MedicalColeges"); 
      dataGridView1.DataSource = ds; 

      // Get total count of the pages; 
      this.CalculateTotalPages(); 
      // Load the first page of data; 
      this.dataGridView1.DataSource = GetCurrentRecords(1, con); 

     } 
     private void CalculateTotalPages() 
     { 
      int rowCount = ds.Tables["MedicalColeges"].Rows.Count; 
      this.TotalPage = rowCount/PageSize; 
      if (rowCount % PageSize > 0) // if remainder is more than zero 
      { 
       this.TotalPage += 1; 
      } 
     } 
     private DataTable GetCurrentRecords(int page, OleDbConnection con) 
     { 
      dt = new DataTable(); 

      if (page == 1) 
      { 
       cmd2 = new OleDbCommand("Select TOP " + PageSize + " * from MedicalColeges ORDER BY MedicalClgID", con); 
       // CurrentPageIndex++; 
      } 
      else 
      { 
       int PreviouspageLimit = (page - 1) * PageSize; 

       cmd2 = new OleDbCommand("Select TOP " + PageSize + 
        " * from MedicalColeges " + 
        "WHERE MedicalClgID NOT IN " + 
       "(Select TOP " + PreviouspageLimit + " MedicalClgID from MedicalColeges ORDER BY MedicalClgID) ", con); // + 
       //"order by customerid", con); 
      } 
      try 
      { 
       // con.Open(); 
       this.adp1.SelectCommand = cmd2; 
       this.adp1.Fill(dt); 
       txtPaging.Text = string.Format("page{0} of {1} pages", this.CurrentPageIndex, this.TotalPage); 
      } 
      finally 
      { 
       // con.Close(); 
      } 
      return dt; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      try 
      {     
       adp1.Update(dt);//here I am getting error 
      } 
      catch (Exception err) 
      { 
       MessageBox.Show(err.Message.ToString()); 
      } 

     } 
} 

ответ

9

Создав OleDbDataAdapter с командой Select только:

adp1 = new OleDbDataAdapter(cmd1); 

OleDbDataAdapter требует действительный Update, Delete команды, которые будут использоваться, чтобы сохранить данные, как это:

adp1.Update(dt);//here I am getting error 

Вам просто нужно использовать OleDbCommandBuilder, который будет генерировать команды для вас:

adp1 = new OleDbDataAdapter(); 
adp1.SelectCommand = cmd1; // cmd1 is your SELECT command 
OleDbCommandBuilder cb = new OleDbCommandBuilder(adp1); 

EDIT

Поскольку вы меняете Выбрать команду OleDbDataAdapter во время выполнения для подкачки, то, что ваша потребность инициализировать каждый раз, когда вы сохраняете данные:

private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     {     
      adp1.SelectCommand = cmd1; // cmd1 is your SELECT command 
      OleDbCommandBuilder cb = new OleDbCommandBuilder(adp1); 
      adp1.Update(dt); //here I hope you won't get error :-) 
     } 
     catch (Exception err) 
     { 
      MessageBox.Show(err.Message.ToString()); 
     } 

    } 
+2

Да, вы правы, теперь я не получаю ошибку и данные обновляются, спасибо :) – Durga

2

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

0

Мне пришлось изменить свой индексный столбец на primary key of my table (как подсказывает Eaint). После этого мне пришлось поднять представление DataSet.xsd в дизайнере, щелкнуть правой кнопкой мыши на визуальном объекте DataTable и выбрать configure. Когда мастер настройки TableAdapter открывается, я нажал кнопку «Дополнительные параметры». Я проверил флажок «Создать вставку, обновление и удаление», затем «ОК» и «Готово». После этого (все еще в представлении дизайнера) я выбрал визуальный объект TableAdapter, который дал мне все полные свойства. SQL был автогенерирован. Потребовалось некоторое время, чтобы я проследил это, поэтому я надеюсь, что это поможет кому-то.

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

  • Нет связанных вопросов^_^