C# 使用OleDbAdapter.Update更新Microsoft Access

C# 使用OleDbAdapter.Update更新Microsoft Access,c#,.net,ms-access,oledb,ms-access-2010,C#,.net,Ms Access,Oledb,Ms Access 2010,我已经能够将MS Access数据库中的数据绑定到表单上的文本框。但是当我更新数据时,不会对数据库进行任何更改。我做了一个简单的例子来说明我的问题。表单只包含两个文本框(txtFirstName和txtLastName)和两个按钮(保存和刷新)。Refresh只是从数据库重新加载DataTable。我加载ID为1的记录并尝试更新。代码如下。我知道文本框的更新也会更新数据表。但是,数据适配器的更新功能不起任何作用,因为OleDbCommandBuilder不生成更新命令。谁能告诉我我做错了什么 非

我已经能够将MS Access数据库中的数据绑定到表单上的文本框。但是当我更新数据时,不会对数据库进行任何更改。我做了一个简单的例子来说明我的问题。表单只包含两个文本框(txtFirstName和txtLastName)和两个按钮(保存和刷新)。Refresh只是从数据库重新加载DataTable。我加载ID为1的记录并尝试更新。代码如下。我知道文本框的更新也会更新数据表。但是,数据适配器的更新功能不起任何作用,因为OleDbCommandBuilder不生成更新命令。谁能告诉我我做错了什么

非常感谢


//全局数据
public DataTable CaseTable=new DataTable();
私有OleDbCommand dbCmd;
专用OLEDB数据适配器;
私人OLEDB公共建筑商;
专用OLEDB连接dbConn=null;
公共FRM客户()
{
初始化组件();
案例表。列。添加(“ID”);
CaseTable.Columns.Add(“FirstName”);
CaseTable.Columns.Add(“LastName”);
this.txtFirstName.DataBindings.Add(“Text”,CaseTable,“FirstName”);/,true,DataSourceUpdateMode.OnPropertyChanged);
this.txtLastName.DataBindings.Add(“Text”,CaseTable,“LastName”);/,true,DataSourceUpdateMode.OnPropertyChanged);
}
私有void frmCustomer_加载(对象发送方,事件参数e)
{
dbConn=new-OleDbConnection(“Provider=Microsoft.ACE.OLEDB.12.0;数据源=Customers.accdb”);
dbCmd=新的OleDbCommand(“从ID=1的客户中选择*”,dbConn);
适配器=新的OleDbDataAdapter(dbCmd);
builder=新的OleDbCommandBuilder(适配器);
RefreshForm();
}
私人表格()
{
CaseTable.Clear();
适配器。填充(箱表);
if(CaseTable.Rows.Count<1)
{
显示(“未找到项”,“错误”,MessageBoxButtons.OK,MessageBoxIcon.Error);
返回;
}
}
私有void btnSave\u单击(对象发送方,事件参数e)
{
if(适配器更新(案例表)<1)
MessageBox.Show(“无更新”);
}
私有void btnRefresh\u单击(对象发送方,事件参数e)
{
RefreshForm();
}

我不知道为什么会这样,但下面是我解决问题的方法。在RefreshForm的末尾,我添加了一行
CaseTable.Rows[0].BeginEdit()
在Save事件处理程序的开头,我添加了一行
CaseTable.Rows[0].EndEdit()


现在,更改被带回数据库。我不知道为什么我找到的在线引用中没有一个引用过这个。

尝试在DataTable上使用GetChanges()。例如,像DataTable dt=CaseTable.GetChanges()adapter.Update(dt)这样的东西,我曾经尝试过类似的东西,但出于某种原因,CaseTable.GetChanges()为null。我知道表格已经更新了,所以我不明白为什么会发生这种情况。
    // Global data
    public DataTable CaseTable = new DataTable();
    private OleDbCommand dbCmd;
    private OleDbDataAdapter adapter;
    private OleDbCommandBuilder builder;
    private OleDbConnection dbConn = null;

    public frmCustomer()
    {
        InitializeComponent();
        CaseTable.Columns.Add("ID");
        CaseTable.Columns.Add("FirstName");
        CaseTable.Columns.Add("LastName");
        this.txtFirstName.DataBindings.Add("Text", CaseTable, "FirstName"); //, true, DataSourceUpdateMode.OnPropertyChanged);
        this.txtLastName.DataBindings.Add("Text", CaseTable, "LastName"); //, true, DataSourceUpdateMode.OnPropertyChanged);
    }

    private void frmCustomer_Load(object sender, EventArgs e)
    {
        dbConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Customers.accdb");
        dbCmd = new OleDbCommand("Select * From Customers Where ID = 1", dbConn);
        adapter = new OleDbDataAdapter(dbCmd);
        builder = new OleDbCommandBuilder(adapter);
        RefreshForm();
    }

    private void RefreshForm()
    {
        CaseTable.Clear();
        adapter.Fill(CaseTable);

        if (CaseTable.Rows.Count < 1)
        {
            MessageBox.Show("Item Not Found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
        }
    }

    private void btnSave_Click(object sender, EventArgs e)
    {
        if (adapter.Update(CaseTable) < 1)
            MessageBox.Show("No updates");
    }

    private void btnRefresh_Click(object sender, EventArgs e)
    {
        RefreshForm();
    }