none
Запись в БД Access RRS feed

  • Вопрос

  • Визуально данные в dataGridView записываются, но в базу данных не попадают. Делал по руководству с MSDN

    делал так:

    dev_servicesDataSet.ServicesRow NewRow = dev_servicesDataSet.Services.NewServicesRow(); NewRow.ServiceCode = textBox1.Text;

    NewRow.ServiceMnemo = Convert.ToInt32(services_MnemoTableAdapter.SelectMcode(comboBox1.Text));

    NewRow.ServiceName = textBox2.Text;                   

    NewRow.ServicePrice = textBox4.Text;                   

    NewRow.ServiceDesc = textBox3.Text;                   

    dev_servicesDataSet.Services.AddServicesRow(NewRow);                   

    servicesTableAdapter.Update(dev_servicesDataSet.Services);


    и так:

    servicesTableAdapter.Connection.Open();
    servicesTableAdapter.Insert(textBox1.Text, textBox2.Text, Convert.ToString(services_MnemoTableAdapter.SelectMcode(comboBox1.Text)), textBox4.Text, textBox3.Text);
    servicesTableAdapter.Update(dev_servicesDataSet.Services);
    servicesTableAdapter.Connection.Close();
    данные физически в БД не попадают. Подскажите пожалуйста!

    2 января 2016 г. 7:09

Ответы

  • Так как вы не смогли определить DataDirectory (совет: в поисковике наберите "how to get DataDirectory") и таким образом не знайте где же находится база, то используйте явный путь к базе в коде выше.

    This posting is provided "AS IS" with no warranties, and confers no rights.

    5 января 2016 г. 17:48
    Модератор

Все ответы

  • Обычно этих баз две. Оригинал который расположен в проекте и копия которая перезаписывается оригиналом при каждом запуске проекта.

    Вы вот где изменения ищите и когда? Надо в копии и до того как она перезаписана. Оригинал конечно никогда не меняется и все изменения в копии будут уничтожены при перезапуске (если конечно не поменять настройки на файле базы).


    This posting is provided "AS IS" with no warranties, and confers no rights.

    2 января 2016 г. 7:20
    Модератор
  • Я проверяю изменения перезапуском проекта. База данных лежит прямо в проекте, вот строка подключения

    Provider=Microsoft.ACE.OLEDB.12.0;Data Source="C:\Users\bukre\Desktop\платные услуги_20160101\платные услуги\Project\Медицинские услуги\Mservices\dev_services.accdb"

    2 января 2016 г. 7:53
  • Поставьте точку останова где нибудь в коде выше и распечатайте:

    servicesTableAdapter.Connection.ConnectionString

    servicesTableAdapter.InsertCommand.CommandText

    dev_servicesDataSet.Services.GetChanges().Rows.Count

    dev_servicesDataSet.Services.HasErrors

    Так  же измените:

    var foo = servicesTableAdapter.Update(dev_servicesDataSet.Services);

    Распечатайте foo после выполнения Update.

    Так же:

    - Приведите код который загружает данные из базы. 

    - Включите останов на любых исключениях и проверьте не было ли их.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    2 января 2016 г. 19:52
    Модератор
  • получается вот что

    try
    {
    string str = servicesTableAdapter.Connection.ConnectionString; //"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dev_services.accdb"
    servicesTableAdapter.Connection.Open();
    servicesTableAdapter.Insert(textBox1.Text, textBox2.Text, Convert.ToString(services_MnemoTableAdapter.SelectMcode(comboBox1.Text)), textBox4.Text, textBox3.Text); // "Вот такой запрос показывает INSERT INTO `Services` (`ServiceCode`, `ServiceName`, `ServiceMnemo`, `ServicePrice`, `ServiceDesc`) VALUES (?, ?, ?, ?, ?)
    //string ct = servicesTableAdapter.InsertCommand.CommandText; //Здесь ругается на  InsertCommand, я делаю на FW 4.0 возможно тут нюанс какой то. 
    //var bar = dev_servicesDataSet.Services.GetChanges().Rows.Count; // Здесь исключение возникает NullReferenceException
    bool se = dev_servicesDataSet.Services.HasErrors; //здесь false
    var foo = servicesTableAdapter.Update(dev_servicesDataSet.Services); // всегда 0
    servicesTableAdapter.Connection.Close();
    }
    catch (Exception b)
    {
    MessageBox.Show("Ошибка записи! \n Ошибка: " + b.Message + "\nМодуль: " + b.Source, "Ошибка записи", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    Если я правильно понял:

    "Приведите код который загружает данные из базы"  - это отображение в dataGrid: показываю на другой форме так:

    private void Servicescs_Load(object sender, EventArgs e)
            {
                // TODO: данная строка кода позволяет загрузить данные в таблицу "dev_servicesDataSet1.MnemoService". При необходимости она может быть перемещена или удалена.
                this.mnemoServiceTableAdapter.Fill(this.dev_servicesDataSet1.MnemoService);
            }

    mnemoService - это таблица  на основе SQL -

    SELECT        Services.ServiceCode, Services.ServiceName, Services.ServicePrice, Services.ServiceDesc, Services_Mnemo.MnemoName
    FROM            (Services INNER JOIN
                             Services_Mnemo ON Services.ServiceMnemo = Services_Mnemo.IDMnemo)

    я использую что бы по коду Мнемо подставлять  его название

    3 января 2016 г. 4:40
  • Хорошо, теперь добавьте все остальные детали как то какой именно DataDirectory, что именно null когда возникает NRE (удобно использовать watch или immediate window для просмотра), как именно ругается и т.п. Так же какой базовый класс для servicesTableAdapter? OleDbDataAdapter?

    В любом случае если результат всегда ноль то именно столько данных и записывается в базу. И, я так понимаю. исключения не возникает?

    Кстати, правильный способ распечатать исключение такой:

    exeception.ToString()

    Плюс иногда имеется дополнительная информация, как например на SqlException.



    This posting is provided "AS IS" with no warranties, and confers no rights.

    3 января 2016 г. 7:26
    Модератор
  • 1. DataDirectory = не знаю где прописывается, но смотрит в корень папки с решением. На рабочем ПК и на домашнем путь всегда в корень папке с решением.

    2. NRE: видимо null как раз Services, строк там  0 при отладке (dev_servicesDataSet.Services.Rows.Count = 0);

    3. Я использовал визуальные компоненты для работ (перетаскивал с компонентов), и да, tableAdapters построены от OleDbDataAdapter

    4. 0 всегда и исключений нет


    • Изменено A. Bukreev 4 января 2016 г. 7:39
    4 января 2016 г. 6:39
  •         Сегодня попробовал даже так. Результат тот же - на родительской форме в дата сет все данные обновляются, а в базу ничего не пишется.            
    OleDbConnection connection = new OleDbConnection(servicesTableAdapter.Connection.ConnectionString);          OleDbCommand InsertOleDb = new OleDbCommand("INSERT INTO Services (ServiceCode, ServiceName, ServiceMnemo, ServicePrice, ServiceDesc) VALUES (?,?,?,?,?)");                    
    OleDbParameter[] param;                    
    param = new OleDbParameter[5];                    
    param[0] = new OleDbParameter();                    
    param[0].Value = textBox1.Text;
    InsertOleDb.Parameters.Add(param[0]);
    param[1] = new OleDbParameter();                    
    param[1].Value = textBox2.Text;
    InsertOleDb.Parameters.Add(param[1]);
    param[2] = new OleDbParameter();                    
    param[2].Value = Convert.ToInt32(services_MnemoTableAdapter.SelectMcode(comboBox1.Text));
    InsertOleDb.Parameters.Add(param[2]);
    param[3] = new OleDbParameter();                 
    param[3].Value = Convert.ToInt32(textBox4.Text);
    InsertOleDb.Parameters.Add(param[3]);
    param[4] = new OleDbParameter();                    
    param[4].Value = textBox3.Text;
    InsertOleDb.Parameters.Add(param[4]);
    InsertOleDb.Connection = connection;
    InsertOleDb.Connection.Open();
    InsertOleDb.ExecuteNonQuery(); 
    InsertOleDb.Connection.Close();

    5 января 2016 г. 13:39
  • Так как вы не смогли определить DataDirectory (совет: в поисковике наберите "how to get DataDirectory") и таким образом не знайте где же находится база, то используйте явный путь к базе в коде выше.

    This posting is provided "AS IS" with no warranties, and confers no rights.

    5 января 2016 г. 17:48
    Модератор
  • Сейчас попробую, но когда я открываю DataSet в конструкторе данных и вручную выполняю запрос Insert все работает и вставляется
    5 января 2016 г. 18:22
  • Да, так все работает.

     AppDomain.CurrentDomain.GetData("DataDirectory")

    мне возвращает "DataDirectory", я правильно понял что нужно ее установить в Environment.CurrentDirectory что бы база виделась правильно в той же папке что и запускаемое приложение?


    • Изменено A. Bukreev 5 января 2016 г. 18:58
    5 января 2016 г. 18:51