C # - не может зафиксировать изменения в Access DB - PullRequest
1 голос
/ 04 ноября 2011

Я работаю над проектом Windows Forms, который требует от меня подключения к базе данных доступа, навигации по записям и добавления / удаления их.Я просмотрел несколько уроков онлайн и подумал, что правильно следую им.В любом случае, я могу добавить новый элемент, и он будет хорошо отображаться в окне, но после выхода все изменения будут потеряны, а база данных не сохранится вообще.Ниже приведен код, который я использую для сохранения базы данных при нажатии кнопки.Я также жестко запрограммировал некоторые тестовые значения только для целей тестирования.

    private DataSet data;
    private int inc;
    private int MaxRows;
    private OleDbConnection connect;
    private OleDbDataAdapter da;

    /**
     * Autoloads the first item into our form's text fields.
     */
    private void BookMgmt_Load(object sender, EventArgs e)
    {
        data = new DataSet();
        connect = new System.Data.OleDb.OleDbConnection();
        connect.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=.\\LibraryAppDB.accdb";
        string Books = "SELECT * FROM Books";
        da = new OleDbDataAdapter(Books, connect);
        connect.Open();
        da.Fill(data, "Books");
        Navigate();
        MaxRows = data.Tables["Books"].Rows.Count;
        connect.Close();
        connect.Dispose();
    }

    /**
     *changes data within the array update form with current 
     *item's info
     */
    private void Navigate()
    {
        ID = data.Tables["Books"].Rows[inc];
        textBox1.Text = ID.ItemArray.GetValue(0).ToString();
        textBox2.Text = ID.ItemArray.GetValue(1).ToString();
        textBox3.Text = ID.ItemArray.GetValue(2).ToString();
        textBox5.Text = ID.ItemArray.GetValue(3).ToString();
        textBox6.Text = ID.ItemArray.GetValue(4).ToString();
        textBox7.Text = ID.ItemArray.GetValue(7).ToString();
        textBox8.Text = ID.ItemArray.GetValue(8).ToString();
        textBox10.Text = ID.ItemArray.GetValue(5).ToString();
        textBox11.Text = ID.ItemArray.GetValue(6).ToString();


    }

    /**
     * Saves the new element added into our actual database
     */
    private void saveButton_Click(object sender, EventArgs e)
    {
        OleDbCommandBuilder cb;
        DataRow dRow = data.Tables["Books"].NewRow();
        cb = new OleDbCommandBuilder(da);
        dRow[0] = 11;
        dRow[1] = "test";
        dRow[2] = "test";
        dRow[3] = "test";
        dRow[5] = "test";
        dRow[6] = "test";
        dRow[7] = "test";
        dRow[8] = "test";

        data.Tables["Books"].Rows.Add(dRow);
        data.AcceptChanges();
        da.Update(data, "Books");
        MaxRows = MaxRows + 1;
        inc = MaxRows - 1;
        Navigate();

        MessageBox.Show("Entry Added", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    /**
     * Deletes the current item displayed on the form
     */
    private void deleteButton_Click(object sender, EventArgs e)
    {
        OleDbCommandBuilder cb;
        cb = new OleDbCommandBuilder(da);
        if (textBox1.Text == "1")
        {
        }
        else
        {
            data.Tables["Books"].Rows[inc].Delete();
            this.MaxRows--;
            this.inc = 0;
            Navigate();
            data.AcceptChanges()
            da.Update(data, "Books");
            MessageBox.Show("Gone");
        }

1 Ответ

2 голосов
/ 04 ноября 2011

data.AcceptChanges() сбрасывает RowState для измененных и новых записей без изменений и удаляет удаленные записи из набора данных. Называя его перед обновлением, вы фактически говорите адаптеру данных "здесь нечего делать"

Просто переместите вызовы для принятия изменений на после вызовов для обновления. Вызов важен, потому что таким образом последующие вызовы для обновления не будут пытаться внести изменения снова

...