none
Обновление базы данных через datagridview RRS feed

  • Вопрос

  • private SQLiteDataAdapter adapter;
            DataTable dt = new DataTable();
     private void ControlSpares_Load(object sender, EventArgs e)
            {
                AvailableSpare(Mark,Model,dataGridView1);
                
    
            }
    public void AvailableSpare(string mark, string Model, DataGridView dgv)
            {
                var sql = string.Format("SELECT [id], [Название], [Сторона], [Особенность], [Цена] FROM [AvailableSpares] Where (Mark='{0}') and (Model='{1}');", mark, Model);
                using (var connect = new SQLiteConnection(Con))
                {
                    if (connect.State == ConnectionState.Closed)
                    {
                        connect.Open();
                    }
                    var command = new SQLiteCommand(sql, connect);
                    adapter = new SQLiteDataAdapter(command);
                    adapter.Fill(dt);
                }
                dgv.DataSource= dt;
            }

    Хочу сделать обновление через:

     private void CONTCARsafe_Click(object sender, EventArgs e)
            {
                adapter.Update(dt);
            }
    

    но выходит ошибка при нажатии: Доступ к ликвидированному объекту невозможен.
    17 февраля 2013 г. 11:02

Ответы

  • В функции AvailableSpare вы используете using для создания SQLiteConnection при выходе из функции данный объект уничтожается а при обновлении вы пытаете его использовать снова, поэтому и возникает ошибка, попробуйте переместить SQLiteConnection в переменную класса
    • Предложено в качестве ответа Varlamov Oleg 17 февраля 2013 г. 14:17
    • Помечено в качестве ответа Abolmasov Dmitry 19 февраля 2013 г. 14:24
    17 февраля 2013 г. 13:59
  • Для этого у адаптера есть свойства для команд на обновление, удаление и вставку, вам надо их создать, посмотрите на класс SQLiteCommandBuilder

    CommandBuilder

    • Помечено в качестве ответа Abolmasov Dmitry 19 февраля 2013 г. 14:24
    17 февраля 2013 г. 16:04
  • Комманда создается правильно, попробуйте раскоментировать обновление бд и поместить его после создания комманды на обновление
    • Изменено Brash_O 21 февраля 2013 г. 10:14
    • Помечено в качестве ответа Magals 21 февраля 2013 г. 11:20
    21 февраля 2013 г. 10:14

Все ответы

  • В функции AvailableSpare вы используете using для создания SQLiteConnection при выходе из функции данный объект уничтожается а при обновлении вы пытаете его использовать снова, поэтому и возникает ошибка, попробуйте переместить SQLiteConnection в переменную класса
    • Предложено в качестве ответа Varlamov Oleg 17 февраля 2013 г. 14:17
    • Помечено в качестве ответа Abolmasov Dmitry 19 февраля 2013 г. 14:24
    17 февраля 2013 г. 13:59
  • теперь :Для обновления требуется действительный UpdateCommand при передаче коллекции DataRow с измененными строками.

    а вот что к нему присвоить надо(UpdateCommand), чтоб произошли все изменения которые были в датагридвиью

    17 февраля 2013 г. 14:45
  • Для этого у адаптера есть свойства для команд на обновление, удаление и вставку, вам надо их создать, посмотрите на класс SQLiteCommandBuilder

    CommandBuilder

    • Помечено в качестве ответа Abolmasov Dmitry 19 февраля 2013 г. 14:24
    17 февраля 2013 г. 16:04
  • Привет. Пожалуйста, не забывайте отмечать ответы, решающие вашу проблему. Спасибо.

    Для связи [mail]

    19 февраля 2013 г. 14:24
  • Пока не выходит.

    private

    SQLiteCommandBuildersqlitecom=

    new

    SQLiteCommandBuilder(adapter);

    ;

    sqlitecom.GetUpdateCommand();

    ничего не пролисходит

    21 февраля 2013 г. 8:55
  • метод GetUpdateCommand  возврашает объект типа SQLiteCommand вам надо присвоить обноименному свойству адаптера

    adapter.UpdateCommand = sqlitecom.GetUpdateCommand(); 

    21 февраля 2013 г. 9:12
  • Сделал, так же нуль реакции

    21 февраля 2013 г. 9:53
  • какое значение у UpdateCommand под бедагером?
    21 февраля 2013 г. 9:55
  • Комманда создается правильно, попробуйте раскоментировать обновление бд и поместить его после создания комманды на обновление
    • Изменено Brash_O 21 февраля 2013 г. 10:14
    • Помечено в качестве ответа Magals 21 февраля 2013 г. 11:20
    21 февраля 2013 г. 10:14
  • Комманда создается правильно, попробуйте раскоментировать обновление бд и поместить его после создания комманды на обновление

    Вы мой кумир, заработало. так просто оказалось.
    21 февраля 2013 г. 11:18
  • Не всегда так просто бывает, но рад что удалось вам помочь с вашей проблемой
    21 февраля 2013 г. 11:22
  • Сейчас работаю с MySQL так же требуется обновить базу данных после некоторых изменений. воспользовался способом который подсказали тут, но вылетает ошибка: Требуется инициализировать свойство DataAdapter.SelectCommand.

    хотя данные в ней и так записаны:

    26 февраля 2013 г. 7:48
  • А на каком методе падет это исключение? Точно на Fill методе?

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

    Спасибо


    Для связи [mail]

    26 февраля 2013 г. 9:22
  • насколько я вижу по скрину подключение к бд обьявляется в одном методе а при выходе из него уничтожается а вот адаптер остается, попробуйте исправить и что после этого будет
    26 февраля 2013 г. 9:35
  • А на каком методе падет это исключение? Точно на Fill методе?

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

    Спасибо


    Для связи [mail]

    это возникает при:_adapter.UpdateCommand
    _adapter.UpdateCommand = _sqlitecom.GetUpdateCommand();
                    _adapter.Update(dt);


    26 февраля 2013 г. 9:51
  • насколько я вижу по скрину подключение к бд обьявляется в одном методе а при выходе из него уничтожается а вот адаптер остается, попробуйте исправить и что после этого будет

    исправил, тоже самое
    26 февраля 2013 г. 9:52
  • исправил дело обычным запросом:

    var ssql = string.Format(@"update aktive_produkte set Ebay='1' where ID='{0}';",
                                             dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1].Value.ToString());
                    using (var con = new MySqlConnection(conn))
                    {
                        if (con.State == ConnectionState.Closed)
                        {
                            con.Open();
                        }
                        using (var sqlComand = con.CreateCommand())
                        {
                            sqlComand.CommandText = ssql;
                            sqlComand.ExecuteNonQuery();
                        }
                        con.Close();
                    }

    проблема было скорей всего в том, что  тип колонки в таблице был tinyint(как булевский тип) а в датагридвию колонка отображалась как чекбоксы, но для апгрейда в запросе должен был присутствовать не "True" или "False" а 0 или 1
    26 февраля 2013 г. 11:05