Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过datagridview实时更新MDB数据库_C#_Ms Access_Datagridview_Real Time Updates - Fatal编程技术网

C# 通过datagridview实时更新MDB数据库

C# 通过datagridview实时更新MDB数据库,c#,ms-access,datagridview,real-time-updates,C#,Ms Access,Datagridview,Real Time Updates,我目前正在尝试创建一个小程序,从datagridview中显示的MDB数据库获取数据。该程序应允许用户修改(添加、更新、删除)datagridview中的数据。此外,所有内容都应自动更新到MDB(无按钮)。我知道有很多关于这个主题的话题,但是由于某些原因,我无法重现相同的结果 我可以从MDB文件中检索数据并在datagridview中显示,但无法添加、修改或删除数据。程序不断向我抛出异常,但我不明白为什么 首先,用户必须创建一个数据库。数据库是由代码自动生成的 private void Crea

我目前正在尝试创建一个小程序,从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();

}
创建数据库后,它将在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中的数据为什么没有更新。我已经被困了一段时间,所以任何帮助都将是伟大的

我可以看到一件会引起问题的事情是,当您设置commandbuilder时,您没有请求相关的更新、删除和插入命令

生成如下所示的命令生成器时:-

cBuilder = new OleDbCommandBuilder(da);
后续行动:-

cBuilder.GetUpdateCommand();
cBuilder.GetInsertCommand();
cBuilder.GetDeleteCommand();
我不确定,您可能需要在单元验证中声明所有这些。试试看

查看这篇MSDN文章,它是针对SQLcommamdbuilder的,但适用相同的规则:-

此外,在尝试更新数据适配器时,您没有与数据适配器的开放连接:-

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

德里克,我的连接是开放的,因为我公开了。它在初始化过程中打开,在窗体关闭时关闭。我还尝试实现更新、插入和删除命令,但这似乎仍然不起作用。它只是崩溃了,说它无法执行更新语法。还有其他建议吗?