На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> Не обновляются данные в таблице при изменении значений в DataGridView
    Сделал тестовую программу, в которой вроде бы изменении данных в DataGridView должны изменяться данных в базе данных:
    ExpandedWrap disabled
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Windows.Forms;
      using System.Data.OleDb;
       
      namespace Reminder
      {
        public partial class Form1 : Form
        {
          private OleDbConnection con;
          private DataSet ds;
          private OleDbDataAdapter da1;
          private OleDbCommand cmd;
          private OleDbParameter p;
          private BindingSource bs;
       
         public void fillDB(String strTableName, String strDsTable, OleDbDataAdapter da, DataGridView dgv, BindingNavigator bn)
         {
           cmd = con.CreateCommand();
           cmd.CommandText = "SELECT * FROM " + strTableName;
           da.SelectCommand = cmd;
           da.Fill(ds, strDsTable);
           bs = new BindingSource();
           bs.DataSource = ds.Tables[strDsTable];
           bn.BindingSource = bs;
           dgv.DataSource = bs;
         }
       
         public void updateDB(String strTableName, OleDbDataAdapter da)
         {
          
           String strUpd = "UPDATE " + strTableName + " SET " +
                           "surname = @surname, " +
                           "firstname = @firstname, " +
                           "birthdate = @birthdate, " +
                           "byear     = @byear " +
                           "WHERE id_contact = @id_contact";
           cmd = con.CreateCommand();
           cmd.CommandText = strUpd;
           p = cmd.Parameters.Add("@id_contact", OleDbType.BigInt, 5, "id_contact");
           p.SourceVersion = DataRowVersion.Original;    
           p = cmd.Parameters.Add("@surname", OleDbType.Char, 40, "surname");
           p.SourceVersion = DataRowVersion.Original;    
           p = cmd.Parameters.Add("@firstname", OleDbType.Char, 40, "firstname");
           p.SourceVersion = DataRowVersion.Original;    
           p = cmd.Parameters.Add("@birthdate", OleDbType.Date, 20, "birthdate");
           p.SourceVersion = DataRowVersion.Original;    
           p = cmd.Parameters.Add("@byear", OleDbType.Integer, 6, "byear");
           p.SourceVersion = DataRowVersion.Original;
           da.UpdateCommand = cmd;
         }
       
          public Form1()
           {
             InitializeComponent();
           }
       
          private void Form1_Load(object sender, EventArgs e)
          {
            con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\Reminder.mdb");
            try
            {
              con.Open();
            }
            catch
            {
              MessageBox.Show("Ошибка соединения с базой данных DBtest.mdb","Ошибка подключения к базе",
                               MessageBoxButtons.OK, MessageBoxIcon.Error);
              Application.Exit();
            }
            da1 = new OleDbDataAdapter();
            ds = new DataSet();
            fillDB("Contact", "tblContact", da1, dataGridView1, binNav1);
            updateDB("Contact", da1);
            dataGridView1.Columns[0].HeaderText = "Номер";
            dataGridView1.Columns[1].HeaderText = "Фамилия";
            dataGridView1.Columns[2].HeaderText = "Имя, отчество";
            dataGridView1.Columns[3].HeaderText = "День рождения";
            dataGridView1.Columns[4].HeaderText = "Год рождения";
            dataGridView1.Sort(dataGridView1.Columns[0], System.ComponentModel.ListSortDirection.Ascending);
          }
       
           private void toolStripButton1_Click(object sender, EventArgs e) // Кнопка на панели Binding Navigator
          {
            da1.Update(ds.Tables[0]);
          }
        }
      }
    Получаю ошибку при изменении поля в DataGridView и попытке записи изменений в базу данных при нажатии кнопки на панели Binding Navigator:
    Необработанное исключение типа "System.Data.OleDb.OleDbException" произошло в System.Data.dll
    Дополнительные сведения: Отсутствует значение для одного или нескольких требуемых параметров.
    Вроде бы все параметры заданы.
    Подскажите, пожалуйста:
    1. Почему возникает ошибка при записи изменений? Вроде бы параметры для обновления я задаю.
    2. Как правильно отлаживать приложения, работающие с базами данных? В частности, как в моем примере локализовать ошибку?
    Прикреплённый файлПрикреплённый файлReminder.zip (31,47 Кбайт, скачиваний: 74)
    Сообщение отредактировано: tuchin -
      Я попробовал изменить программу в соответствии с книгой "Программирование ADO.NET", автор Сеппа, 2007 год:
      ExpandedWrap disabled
        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;
        using System.Data.OleDb;
         
        namespace Reminder
        {
          public partial class Form1 : Form
          {
            private OleDbConnection con;
            private DataSet ds;
            private OleDbDataAdapter da1;
            private OleDbCommand cmd;
            private OleDbParameter p;
            private OleDbParameterCollection pc;
            private BindingSource bs;
         
           public void fillDB(String strTableName, String strDsTable, OleDbDataAdapter da, DataGridView dgv, BindingNavigator bn)
           {
             cmd = con.CreateCommand();
             cmd.CommandText = "SELECT * FROM " + strTableName;
             da.SelectCommand = cmd;
             da.Fill(ds, strDsTable);
             bs = new BindingSource();
             bs.DataSource = ds.Tables[strDsTable];
             bn.BindingSource = bs;
             dgv.DataSource = bs;
           }
         
           public void updateDB(String strTableName, OleDbDataAdapter da)
           {
            
             String strUpd = "UPDATE " + strTableName + " SET " + "id_contact = @id_contact_new, " +
                             "surname = @surname_new, firstname = @firstname_new, birthdate = @birthdate_new, byear = @byear_new " +
                             "WHERE " + "id_contact = @id_contact_old AND " +
                             "surname = @surname_old AND firstname = @firstname_old AND birthdate = @birthdate_old AND byear = @byear_old;";
             da.UpdateCommand = new OleDbCommand(strUpd, con);
             pc = da.UpdateCommand.Parameters;
             pc.Add("@id_contact_new", OleDbType.BigInt, 0, "id_contact");
             pc.Add("@surname_new", OleDbType.Char, 0, "surname");
             pc.Add("@firstname_new", OleDbType.Char, 0, "firstname");
             pc.Add("@birthdate_new", OleDbType.Date, 0, "birthdate");
             pc.Add("@byear_new", OleDbType.Integer, 0, "byear");
         
             p = pc.Add("@id_contact_old", OleDbType.BigInt, 0, "id_contact");
             p.SourceVersion = DataRowVersion.Original;
             p = pc.Add("@surname_old", OleDbType.Char, 0, "surname");
             p.SourceVersion = DataRowVersion.Original;
             p = pc.Add("@firstname_old", OleDbType.Char, 0, "firstname");
             p.SourceVersion = DataRowVersion.Original;
             p = pc.Add("@birthdate_old", OleDbType.Date, 0, "birthdate");
             p.SourceVersion = DataRowVersion.Original;
             p = pc.Add("@byear_old", OleDbType.Integer, 0, "byear");
             p.SourceVersion = DataRowVersion.Original;
           }
         
            public Form1()
             {
               InitializeComponent();
             }
         
            private void Form1_Load(object sender, EventArgs e)
            {
              con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\Reminder.mdb");
              try
              {
                con.Open();
              }
              catch
              {
                MessageBox.Show("Ошибка соединения с базой данных DBtest.mdb","Ошибка подключения к базе",
                                 MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
              }
              da1 = new OleDbDataAdapter();
              ds = new DataSet();
              fillDB("Contact", "tblContact", da1, dataGridView1, binNav1);
              updateDB("Contact", da1);
              dataGridView1.Columns[0].HeaderText = "Номер";
              dataGridView1.Columns[1].HeaderText = "Фамилия";
              dataGridView1.Columns[2].HeaderText = "Имя, отчество";
              dataGridView1.Columns[3].HeaderText = "День рождения";
              dataGridView1.Columns[4].HeaderText = "Год рождения";
              dataGridView1.Sort(dataGridView1.Columns[0], System.ComponentModel.ListSortDirection.Ascending);
            }
         
            private void toolStripButton1_Click(object sender, EventArgs e)
            {
              da1.Update(ds.Tables[0]);
            }
          }
        }
      Получаю сообщение: Необработанное исключение типа "System.Data.OleDb.OleDbException" произошло в System.Data.dll. Дополнительные сведения: Отсутствует значение для одного или нескольких требуемых параметров. Несколько раз проверил, вроде бы все соответствует книге. Как локализовать ошибку (какой конкретно параметр не задан) я не знаю. Может быть профессионалы ADO.NET помогут?
      Сообщение отредактировано: tuchin -
        У Вас в базе поле byrthday, а в тексте Вы используете byrthdate. Я немного исправил Вашу программу, вроде бы вставка, изменение и удаление работают.

        Для меня непонятным осталось следующее:
        если при редактировании или добавлении выделение остается на редактируемой (новой) строке, то редактирование (вставка новой строки) не происходит. Если нажать Enter или выделить элемент другой строки, то все запоминается в базе данных. Как сделать так, чтобы при нажатии кнопки на Навигаторе даже без нажатия Enter или выделении элемента другой строки изменения в базе данных происходили?
        Прикреплённый файлПрикреплённый файлReminderTest.zip (35,42 Кбайт, скачиваний: 76)
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,0960 ]   [ 21 queries used ]   [ Generated: 19.09.18, 16:46 GMT ]