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!