使用OleDbAdapter.Update更新Microsoft Access

时间:2013-06-25 20:06:07

标签: c# .net ms-access oledb ms-access-2010

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

非常感谢!


    // 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();
    }

1 个答案:

答案 0 :(得分:1)

我不知道为什么会这样,但这是我如何解决我的问题。在RefreshForm结束时,我添加了行
   CaseTable.Rows [0] .BeginEdit();
在Save事件处理程序的开头,我添加了行
   CaseTable.Rows [0] .EndEdit();

现在更改将传回数据库。我不确定为什么我找到的在线参考文献都没有提到这一点。