通过datagridview实时更新MDB数据库

本文关键字:数据库 MDB 实时更新 datagridview 通过 | 更新日期: 2023-09-27 18:01:27

我目前正在尝试创建一个小程序,该程序从显示在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的windows窗体中使用。

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中的数据被更改(由cellvalidation事件处理),数据应该在MDB中更新。

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

代码非常直接,但由于某种原因,我无法弄清楚为什么MDB中的数据没有更新。我已经被困了一段时间了,所以任何帮助都会很棒!

通过datagridview实时更新MDB数据库

我可以看到,这将导致一个问题是,当你设置你的命令构建器,你没有请求相关的更新,删除& &;插入命令。

当您像这样生成命令构建器时:-

cBuilder = new OleDbCommandBuilder(da);

跟进:-

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

您可能需要在单元格验证中声明所有这些,我不确定。试一试。

查看这篇MSDN文章,它是为sqlcommandbuilder,但同样的规则适用:-

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