并发错误WinForms绑定源导航器

时间:2018-05-22 21:33:53

标签: sql-server winforms visual-studio data-binding

我有一个包含客户信息的表单,每页需要处理一个事务。我使用绑定导航器来管理我的分页。

除了某些情况外,它适用于所有情况。在它不起作用的情况下,我必须打开一个不同的窗口来查找信息并将其返回到主窗体。这是代码:

        // 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。

1 个答案:

答案 0 :(得分:0)

好的 - 所以问题是我试图从程序中更新当前行并使用绑定导航器。他们没有正常合作。

解决方案是在表单设计器中向表单添加一个文本框,并设置visible = false并将其绑定到ACCT_NO。一旦我从其他表单获得结果,我只需要将ACCT_NO文本框的.text属性设置为新值,绑定导航器就能正确管理我的所有更新。

txtAcct_No.text = results.ToString();