อัพเดตฐานข้อมูล MDB แบบเรียลไทม์ผ่าน DataGridview

ขณะนี้ฉันกำลังพยายามสร้างโปรแกรมขนาดเล็กที่รับข้อมูลจากฐานข้อมูล 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 จึงไม่ได้รับการอัพเดต ฉันติดอยู่มาระยะหนึ่งแล้ว ดังนั้นความช่วยเหลือใด ๆ จะดีมาก!


person user2118930    schedule 28.02.2013    source แหล่งที่มา


คำตอบ (1)


สิ่งหนึ่งที่ฉันเห็นได้ว่าจะทำให้เกิดปัญหาคือเมื่อคุณตั้งค่า commandbuilder คุณไม่ได้ร้องขอคำสั่ง UPDATE, DELETE & INSERT ที่เกี่ยวข้อง

เมื่อคุณสร้างตัวสร้างคำสั่งดังนี้:-

cBuilder = new OleDbCommandBuilder(da);

ตามด้วย :-

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

คุณอาจต้องประกาศทั้งหมดนี้ใน Cell Validating ฉันไม่แน่ใจ ให้มันลอง.

ดูบทความ MSDN นี้สำหรับ SQLcommamdbuilder แต่ใช้กฎเดียวกัน: -

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

นอกจากนี้ คุณไม่มีการเชื่อมต่อแบบเปิดกับ Data Adapter ขณะที่คุณพยายามอัปเดต :-

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

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

        ScheduleData.AcceptChanges();
     }

สตริง SQL ของคุณไม่ถูกต้อง ลอง:-

"SELECT (Day, Month, Year, IMS, Customer, Short Description, Long Description, Delivery Ticket Number, Returned) FROM [SCHEDULE]"
person Derek    schedule 28.02.2013
comment
เดเร็ก การเชื่อมต่อของฉันเปิดกว้างเพราะฉันเปิดเผยต่อสาธารณะ มันถูกเปิดภายในขั้นตอนการเตรียมใช้งาน และปิดเมื่อปิดแบบฟอร์ม - person user2118930; 28.02.2013
comment
ฉันยังลองใช้คำสั่งอัปเดต แทรก และลบ แต่ดูเหมือนว่าจะไม่ทำงาน มันขัดข้องและบอกว่าไม่สามารถดำเนินการอัพเดตไวยากรณ์ได้ มีข้อเสนอแนะอื่นๆ อีกไหม? - person user2118930; 28.02.2013