На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Не могу сохранить изменения в БД , Программа на C# для работы c БД MS Access трудности с сохранением изм
    Здравствуйте, я новичок в ADO.NET и SQL, сам изучаю C# так что не судите строго... Но конструктивная критика приветствуется.
    Я видел подобные вопросы на форуме, но ответы на них мне, к сожалению, не помогли, поэтому решился все таки задать свой вопрос.
    Пишу простенькую программу для вывода БД MS Access на экран(на DataGridView),с возможностью внесения изменений в БД,
    с последующим их сохранением. Проблема в сохранения...ошибка, насколько я понял в возврате этих изменений.При ручной проверке сама БД в DataSet(сохранил измененнную БД в xml) меняется, а вот вернуть изменения назад в исходную БД через OleDbDataAdapter не получается...(ну я так думаю)
    Возможно OleDbCommandBuilder генеруриет не совсем верную sql команду UPDATE, но в sql не силен. (БД состоит из трех столбцов: Номер(ключ), Фамилия, Имя)
    А вот точное описание ошибки генерируемое соотвествующим исключением :
    ExpandedWrap disabled
      При обновлении не удалось найти TableMapping["[table]"] или DataTable "[table]"
    - и я походу не знаю что такое TableMapping и зачем он нужен.
    А если в
    ExpandedWrap disabled
      this.adapter.Update(this.dataSet, "[table]");
    заменить на
    ExpandedWrap disabled
      this.adapter.Update(this.dataSet.Tables[0]);
    то выдает Ошибка в синтаксисе команды UPDATE
    А команда UPDATE задана как:
    ExpandedWrap disabled
      UPDATE table SET Фамилия = ?, Имя = ? WHERE ((Номер = ?) AND ((? = 1 AND Фамилия IS NULL) OR (Фамилия = ?)) AND ((? = 1 AND Имя IS NULL) OR (Имя = ?)))

    Ладно это все лирика вот исходный код...
    ExpandedWrap disabled
      public partial class Form1 : Form
          {    
              private DataBase myDB = new DataBase();
              public Form1()
              {
                  InitializeComponent();
              }
              
               private void button1_Click(object sender, EventArgs e)
              {
                  dataGridView1.DataSource = myDB.Load(textBox1.Text);
              }
       
              private void button2_Click(object sender, EventArgs e)
              {
                  
                  myDB.Save();
              }
          }
       
          class DataBase
          {
              private System.Data.OleDb.OleDbConnection connect;
              private System.Data.DataSet dataSet;
              private System.Data.OleDb.OleDbDataAdapter adapter;
              private System.Windows.Forms.BindingSource binding;
              private System.Data.OleDb.OleDbCommandBuilder cmdBuild;
              
              public DataBase()
              {
                  connect = new System.Data.OleDb.OleDbConnection();
                  dataSet = new DataSet();
                  binding = new BindingSource();
                  
              }
              public System.Windows.Forms.BindingSource Load(string dbSource)
              {
                  //SELECT что_взять FROM откуда_взять
                  string select = "SELECT * FROM [table]"; //* - взять все
                  connect.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbSource;
                  //обработчик ошибок : проверка на возможность подключения к БД
                  try
                  {
                      connect.Open();
                  }
                  catch (Exception ex)
                  {
                      //вывод сообщения об ошибке
                      MessageBox.Show(ex.Message);
                      Application.Exit(); //выход из приложения
                  }
                  adapter = new System.Data.OleDb.OleDbDataAdapter(select, connect);
                  cmdBuild = new System.Data.OleDb.OleDbCommandBuilder(adapter);
                  adapter.UpdateCommand = cmdBuild.GetUpdateCommand();
                  adapter.Fill(dataSet);
                  binding.DataSource = dataSet.Tables[0].DefaultView;
                  return binding;          
                  
              }
       
              public void Save()
              {
                  try
                  {
                      //кеш БД меняется, но обновить БД пока не получается
                      dataSet.WriteXml("1.xml"); //так для проверки
                      this.binding.EndEdit();
                      this.adapter.Update(this.dataSet, "[table]");
                      MessageBox.Show("БД успешно сохранена");
                      
                  }
                  catch
                  {
                      MessageBox.Show(ex.Message);
                  }
       
              }
          }
          
      }

    (Работаю в среде Microsoft Visual C# 2008, экспресс-выпуск - пакет обновления 1 (SP1) - RUS)
    Заранее благодарен за любую помощь в решении проблемы.
    Сообщение отредактировано: Nuts -
      Переименуй таблицу. Некошерно использовать служебные слова в именах об'ектов БД.
        А какой должен быть синтаксис команды SELECT чтобы открывать базу с любым именем?(или это как-то по другому делается)
        Или можно как-нибудь через OleDbConnection получить имя подключаемой БД?
        Сообщение отредактировано: Nuts -
          -Added
          Цитата MIF @
          Переименуй таблицу. Некошерно использовать служебные слова в именах об'ектов БД.

          спасибо, дал нужное направление
          Сообщение отредактировано: Nuts -
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0581 ]   [ 15 queries used ]   [ Generated: 17.06.25, 03:56 GMT ]