我已经能够将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();
}
答案 0 :(得分:1)
我不知道为什么会这样,但这是我如何解决我的问题。在RefreshForm结束时,我添加了行
CaseTable.Rows [0] .BeginEdit();
在Save事件处理程序的开头,我添加了行
CaseTable.Rows [0] .EndEdit();
现在更改将传回数据库。我不确定为什么我找到的在线参考文献都没有提到这一点。