我有一个包含客户信息的表单,每页需要处理一个事务。我使用绑定导航器来管理我的分页。
除了某些情况外,它适用于所有情况。在它不起作用的情况下,我必须打开一个不同的窗口来查找信息并将其返回到主窗体。这是代码:
// save current work
updateDataTable();
// Open a window and get new customer info
// CurrentCustomer is returned from the opened window
using (SqlConnection cx = new SqlConnection(GetConnectionString()))
{
DataRowView dataRow = (DataRowView)procBindingSource.Current;
dataRow.BeginEdit();
dataRow["CUSTOMER"] = CurrentCustomer;
dataRow.EndEdit();
updateDataItems();
SqlCommand cmd = new SqlCommand(
@" select acct_no from cust_processing where id = @id ", cx);
cmd.Parameters.AddWithValue("@id", (int)dataRow["ID"]);
cx.Open();
var results = cmd.ExecuteScalar();
if (results != null)
{
dataRow.BeginEdit();
dataRow["ACCT_NO"] = results.ToString();
dataRow.EndEdit();
updateDataItems(); <------ CONCURRENCY ERROR
}
}
我得到的错误是并发错误。我想我可能有多个版本的行?我以为我通过调用updateDataTable()来确保我在该行的最新版本上。我是唯一的用户,所以我知道我自己创造了这个问题。
这是我的更新方法,当我更改页面或保存并退出或想要写入提交数据时调用该方法:
void updateDataItems()
{
this.procBindingSource.EndEdit();
this.procTableAdapter.Update(xyzDataSet);
xyzDataSet.AcceptChanges();
}
我尝试过从各个地方执行updateDataItems,例如在我分配dataRow [&#34; ACCT_NO&#34;] = results.ToString()之后或者在分配之前和之后。
我几乎要猜测并检查所以任何想法,帮助和建议都将受到赞赏和+1。
答案 0 :(得分:0)
好的 - 所以问题是我试图从程序中更新当前行并使用绑定导航器。他们没有正常合作。
解决方案是在表单设计器中向表单添加一个文本框,并设置visible = false并将其绑定到ACCT_NO。一旦我从其他表单获得结果,我只需要将ACCT_NO文本框的.text属性设置为新值,绑定导航器就能正确管理我的所有更新。
txtAcct_No.text = results.ToString();