2013-02-28 78 views
0

我目前正在嘗試創建一個小程序,該程序從datagridview中顯示的MDB數據庫中獲取數據。該程序應允許用戶修改(添加,更新,刪除)datagridview中的數據。此外,一切都應該自動更新到MDB(無按鈕)。我知道關於這個主題有很多話題,但是由於某些原因,我無法重現相同的結果。通過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(); 

} 

一旦數據庫已經創建,它就會在窗體中使用,並在其中包含一個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中的數據沒有更新。我一直堅持一段時間,所以任何幫助都會很棒!

回答

0

我可以看到的一件事會導致一個問題,那就是當你設置你的命令生成器時,你沒有請求相關的UPDATE,那麼刪除& INSERT命令。

當您生成命令生成器是這樣的: -

cBuilder = new OleDbCommandBuilder(da); 

跟進: -

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

您可能需要聲明的是這個小區中的驗證,我不能確定。試一試。這個MSDN文章

過目,其對SQLcommamdbuilder,但同樣的規則: -

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

而且,你有沒有打開的連接到數據適配器,當你試圖更新: -

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]" 
+0

德rek,我的連接是開放的,因爲我公開了它。它在初始化過程中打開並在表單關閉時關閉。 – user2118930 2013-02-28 11:37:01

+0

我也嘗試實現更新,插入和刪除命令,但這似乎仍然不起作用。它只是崩潰,並說它無法執行更新語法。還有其他建議嗎? – user2118930 2013-02-28 11:44:03

+0

您的SQL語法很糟糕,請參閱我的更新。 – Derek 2013-02-28 12:38:05