ขณะนี้ฉันกำลังพยายามสร้างโปรแกรมขนาดเล็กที่รับข้อมูลจากฐานข้อมูล MDB ที่แสดงใน DataGridview โปรแกรมควรอนุญาตให้ผู้ใช้แก้ไข (เพิ่ม อัปเดต ลบ) ข้อมูลใน DataGridview นอกจากนี้ทุกอย่างควรได้รับการอัปเดตเป็น MDB โดยอัตโนมัติ (ไม่มีปุ่ม) ฉันรู้ว่ามีหัวข้อมากมายเกี่ยวกับเรื่องนี้ แต่ด้วยเหตุผลบางอย่าง ฉันไม่สามารถสร้างผลลัพธ์เดียวกันได้
ฉันสามารถดึงข้อมูลจากไฟล์ MDB และแสดงใน datagridview ได้ แต่ฉันไม่สามารถเพิ่ม แก้ไข หรือลบข้อมูลได้ โปรแกรมส่งข้อยกเว้นมาที่ฉัน แต่ฉันไม่เข้าใจว่าทำไม
ขั้นแรกผู้ใช้จะต้องสร้างฐานข้อมูล ฐานข้อมูลถูกสร้างขึ้นโดยอัตโนมัติด้วยรหัส
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();
}
เมื่อสร้างฐานข้อมูลแล้ว ระบบจะใช้ในรูปแบบ Windows โดยมี DataGridview อยู่ในนั้น
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;
}
}
เมื่อข้อมูลใน datagridview มีการเปลี่ยนแปลง (จัดการโดยเหตุการณ์ CellValidating) ข้อมูลควรได้รับการอัปเดตใน MDB
private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (ScheduleData.GetChanges() != null)
{
dataGridView.EndEdit();
da.Update(ScheduleData);
ScheduleData.AcceptChanges();
}
}
โค้ดค่อนข้างตรงไปตรงมา แต่ด้วยเหตุผลบางอย่าง ฉันไม่สามารถเข้าใจได้ว่าเหตุใดข้อมูลใน MDB จึงไม่ได้รับการอัพเดต ฉันติดอยู่มาระยะหนึ่งแล้ว ดังนั้นความช่วยเหลือใด ๆ จะดีมาก!