Memperbarui database MDB secara realtime melalui datagridview

Saat ini saya mencoba membuat program kecil yang mengambil data dari database MDB yang ditampilkan di datagridview. Program harus memungkinkan pengguna untuk mengubah (menambah, memperbarui, menghapus) data di datagridview. Selanjutnya semuanya harus diperbarui ke MDB secara otomatis (tanpa tombol). Saya tahu ada banyak topik di luar sana mengenai subjek ini, namun karena alasan tertentu saya tidak dapat mereproduksi hasil yang sama.

Saya dapat mengambil data dari file MDB dan menampilkannya di datagridview tetapi saya tidak dapat menambah, mengubah atau menghapus data. Program ini terus memberikan pengecualian kepada saya, tetapi saya tidak mengerti alasannya.

Pertama pengguna harus membuat database. Basis data dihasilkan secara otomatis dengan kode.

private void CreateNewDatabase_Click(object sender, EventArgs e)
{
    string DB_FILENAME = "c:\Test.mdb";

    // GENERATE THE ACCESS FILES, ITS TABLES AND ITS COLUMNS

    var cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0.;Data Source=" + DB_FILENAME; //Use a late bound COM object to create a new catalog. This is so we avoid an interop assembly
    var catType = Type.GetTypeFromProgID("ADOX.Catalog");
    object o = Activator.CreateInstance(catType);
    catType.InvokeMember("Create", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] { cnnStr });
    OleDbConnection cnn = new OleDbConnection(cnnStr);
    cnn.Open();
    var cmd = cnn.CreateCommand();

    // CREATE SCHEDULE TABLE
    cmd.CommandText = "CREATE TABLE SCHEDULE ([ID] IDENTITY PRIMARY KEY, [Day] TEXT, [Month] TEXT, [Year] TEXT, [IMS] TEXT, [Customer] TEXT, [Short Description] TEXT, [Long Description] TEXT, [Delivery Ticket Number] TEXT, [Returned] TEXT)";
    cmd.ExecuteNonQuery();

    cmd.CommandText = "INSERT INTO SCHEDULE ([ID]) VALUES (1)";
    cmd.ExecuteNonQuery();

    // DISPOSE OF THE VARIABLES USED
    cnn.Close();
    cnn.Dispose();
    cmd.Dispose();

}

Setelah database dibuat, database digunakan dalam formulir windows dengan datagridview di dalamnya.

public void Initialize()
{

    Con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sttngs.DBloc);
    Con.Open();

    // TRY TO OPEN THE DATABASE FILE AND POPULATE THE DATAGRIDVIEW
    da = new OleDbDataAdapter("SELECT [Day], [Month], [Year], [IMS], [Customer], [Short Description], [Long Description], [Delivery Ticket Number], [Returned] FROM SCHEDULE",Con); // WHERE [Returned] = '" + "NO' ", Con);

    // POPULATE cBuilder
    cBuilder = new OleDbCommandBuilder(da);
    ScheduleData = new DataTable();
    da.Fill(ScheduleData);

    if (ScheduleData.Rows.Count > 0)
    {
       BindingSource BDS = new BindingSource();
       BDS.DataSource = ScheduleData;
       this.dataGridView.DataSource = BDS;        
    }
}

Setelah data di datagridview diubah (ditangani oleh acara CellValidating), data harus diperbarui di MDB.

 private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
 {
     if (ScheduleData.GetChanges() != null)
     {
        dataGridView.EndEdit();
        da.Update(ScheduleData);
        ScheduleData.AcceptChanges();
     }
 }

Kode ini cukup mudah tetapi karena alasan tertentu saya tidak dapat mengetahui mengapa data di MDB tidak diperbarui. Saya telah terjebak untuk sementara waktu sekarang jadi bantuan apa pun akan sangat membantu!


person user2118930    schedule 28.02.2013    source sumber


Jawaban (1)


Satu hal yang saya lihat akan menyebabkan masalah adalah ketika Anda mengatur pembuat perintah, Anda tidak meminta perintah UPDATE, DELETE & INSERT yang relevan.

Saat Anda membuat pembuat perintah seperti ini :-

cBuilder = new OleDbCommandBuilder(da);

Tindak lanjuti dengan: -

cBuilder.GetUpdateCommand();
cBuilder.GetInsertCommand();
cBuilder.GetDeleteCommand();

Anda mungkin perlu mendeklarasikan semua ini di Validasi Sel, saya tidak yakin. Cobalah.

Lihat artikel MSDN ini, ini untuk SQLcommamdbuilder, tetapi aturan yang sama berlaku: -

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder.aspx

Selain itu, Anda tidak memiliki koneksi terbuka ke Adaptor Data saat Anda mencoba memperbaruinya :-

if (ScheduleData.GetChanges() != null)
     {
        dataGridView.EndEdit();

        //Open a connection Here
        da.Update(ScheduleData);

        ScheduleData.AcceptChanges();
     }

String SQL Anda salah, coba :-

"SELECT (Day, Month, Year, IMS, Customer, Short Description, Long Description, Delivery Ticket Number, Returned) FROM [SCHEDULE]"
person Derek    schedule 28.02.2013
comment
Derek, koneksi saya terbuka karena saya mempublikasikannya. Itu dibuka di dalam prosedur inisialisasi dan ditutup ketika formulir ditutup. - person user2118930; 28.02.2013
comment
Saya juga mencoba menerapkan perintah perbarui, masukkan dan hapus tetapi sepertinya masih tidak berhasil. Itu hanya crash dan mengatakan bahwa ia tidak dapat melakukan pembaruan sintaksis. Ada saran lain? - person user2118930; 28.02.2013