Помогите с обновлением базы данных доступа с помощью Update (dataTable) - PullRequest
0 голосов
/ 22 августа 2011

Я посмотрел повсюду, но не могу заставить это работать.

Я пытаюсь обновить базу данных Access из DataGridView. Загрузка базы данных в сетку работает нормально. Я использовал инструкции, описанные в на этом сайте .

Однако для обновления базы данных на основе изменений, внесенных в DataGridView, я использовал команду dataAdapter.Update(datatable);, но в зависимости от размещения (рядом с этим кодом) код выполняется, но база данных не обновляется. Если я помещаю его в кнопку, он выдает исключение «синтаксическая ошибка при вставке в оператор».

Другой вопрос: я должен закрыть переменную соединения после загрузки DataGridView? Если да, должен ли я снова открыть его, чтобы выполнить обновление, а затем снова закрыть его? Как это работает?

Любая помощь будет принята с благодарностью. РЕДАКТИРОВАТЬ: положить весь класс, как Тим спросил.

 public partial class Pantalla_Proyecto : Form
{
    private Inicio Inicio;
    private List<string> Logueado;
    private OleDbConnection conn;
    private OleDbDataAdapter Adaptador;
    private DataTable Tabla;
    private BindingSource Bsource;
    private OleDbCommandBuilder Builder;

    public Pantalla_Proyecto(Inicio Inicio, List<string> Logueado)
    {
        this.Inicio =Inicio;
        this.Logueado = Logueado;
        InitializeComponent();
    }
    private void Pantalla_Proyecto_Load(object sender, EventArgs e)
    {
    }

     private void importarCDPToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Importar_CDP Importar_CDP = new Importar_CDP();
        Importar_CDP.Show();
    }

    private void importarListasToolStripMenuItem_Click(object sender, EventArgs e)
    {
        WindowsFormsApplication1.Formularios.Lista_Lazos.Importar_Listas1 Importar_Listas = new WindowsFormsApplication1.Formularios.Lista_Lazos.Importar_Listas1();
        Importar_Listas.Show();
    }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {

    }

    private void flowLayoutPanel2_Paint(object sender, PaintEventArgs e)
    {

    }

    private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {

    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string sql = "Select *  From ["+TABLE (THIS IS A STRING I GET FROM PREVIOUS FORM)+"]";
        conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=proyectos\" + Location(this is a string i get on the previous form) + ".mdb;User Id=admin;Password=;");
        conn.Open();

        //  Extraemos info de mi database y la meto en un datatable
        Adaptador = new OleDbDataAdapter(sql, conn);
        Builder = new OleDbCommandBuilder(Adaptador);
        Tabla = new DataTable();
        Adaptador.Fill(Tabla);

        // LLENO EL DATA GRID VIEW
        Bsource = new BindingSource();
        Bsource.DataSource = Tabla;
        dataGridView1.DataSource = Bsource;
        dataGridView1.Dock = DockStyle.Fill;
        Adaptador.Update(Tabla);//if i put it here nothing happens
        conn.Close();


    }

    private void dataGridView1_Validating(object sender, CancelEventArgs e)
    {

    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        conn.Open();
        Adaptador.Update(Tabla);//IF i put it here i get an exception
        conn.Close();
    }

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Чтобы уточнить, согласно запросу OP, оператор using, возьмем метод comboBox1_SelectedIndexChanged:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    string sql = "Select *  From ["+TABLE (THIS IS A STRING I GET FROM PREVIOUS FORM)+"]";

    using (conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=proyectos\" + Location(this is a string i get on the previous form) + ".mdb;User Id=admin;Password=;"))
    {
        conn.Open();

        //  Extraemos info de mi database y la meto en un datatable
        Adaptador = new OleDbDataAdapter(sql, conn);
        //  Remove the OleDbCommandBuilder
        Tabla = new DataTable();
        Adaptador.Fill(Tabla);

        // LLENO EL DATA GRID VIEW
        Bsource = new BindingSource();
        Bsource.DataSource = Tabla;
        dataGridView1.DataSource = Bsource;
        dataGridView1.Dock = DockStyle.Fill;
        // ** NOTE:
        // At this point, there's nothing to update - all that
        // has happened is that you've bound the DataTable
        // to the DataGridView.
        Adaptador.Update(Tabla);//if i put it here nothing happens

    } // Your connection will be closed at this point when the using
      // statement goes out of scope.
}

ОБНОВЛЕНИЕ

MSDN говорит: «При созданииновый экземпляр OleDbCommandBuilder, любой существующий OleDbCommandBuilder, связанный с этим OleDbDataAdapter, выпущен ".

Однако, если вы хотите полностью уйти от OleDbCommandBuilder, вы можете сделать это (я обновил свой код выше, чтобы сделать это).Поскольку вы полагаете, что у вас есть проблемы со специальными символами, вероятно, стоит сделать это следующим образом.

Что-то вроде этого должно помочь - вам придется изменить команду обновления в зависимости от столбцов таблицы:

private void button1_Click_1(object sender, EventArgs e)
{

    conn.Open();        
    Adaptador.UpdateCommand = "<Your SQL here>"  // I.e., UPDATE [TABLE] SET....
    try
    {
        Adaptador.Update((DataTable)Bsource.DataSource);
    }
    catch (Exception ex)
    {
        // Do something with the exception
    }
}

Этот код является слегка измененной версией MSDN:

Как связать данные с элементом управления DataGridView Windows Forms

Обратите внимание, что они используют SqlDbCommandBuilder в этом примере, но общий принцип остается тем же.

На основании комментария Дэвида-В-Фентона вы можете захотеть выполнить инициализацию своего соединения и адаптера данных в событии Form_Load, а затемзакрыть соединение по событию Form_Closing.

0 голосов
/ 22 августа 2011

Первое, что нужно проверить, - это путь выполнения файла Access, который вы на самом деле обновляете.

Если вы используете VS.NET, файл MDB является частью вашего проекта, и чтоДля параметра «Копировать локальный» в файле MDB установлено значение «истина», поэтому может случиться так, что каждый раз, когда вы запускаете свою программу, вы перезаписываете обновления с последнего выполнения.

Я просто упоминаю, потому чтобыл укушен этим; -)

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...