【发布时间】:2016-12-26 15:12:49
【问题描述】:
我正在使用 .NET Framework 4.6.1、WinForms、PostgreSQL 6.4beta4 和 Npgsql 和 ADO.NET。
我当前的应用程序是一个多用户应用程序,所有用户都连接到同一个数据库。
使用 DataTable、BindingSource 和 BindingNavigator 将数据绑定到控件。
我想避免两个用户可以同时编辑一个 DataRow。 因为我想以更通用的方法实现这一点,所以我正在考虑创建一个 DataTable 后代并添加属性 LockMode (None, Row, Table)。
我发现您可以结合使用 ColumnChanged 事件和 RowState 来检测数据的变化。
我现在知道用户是在插入新值、编辑(RowState = 已修改)现有值还是只是查看(RowState = 未更改)记录。
因此,我正在寻找一种解决方案,以便在用户开始编辑 DataRow 时对其进行锁定。在应用程序中,一旦用户导航(通过使用 Bindingnavigator 或以编程方式)到锁定的记录,我想显示一条消息。
我发现的大多数解决方案都以这样的 MySql Server 为目标:How to perform a row lock? 或 TransactionScope locking table and IsolationLevel。
但是我正在寻找一个 PostgreSQL 解决方案,所以即使是来自 MS (https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope(v=vs.110).aspx) 的关于这个主题的文章也不能在这里使用。
如果有 PostgreSQL 和 ADO.NET 经验的人可以在这里帮助我,我将不胜感激。谢谢。
【问题讨论】:
-
在 NET 中,您从客户端加载的数据与数据库中的数据“断开连接”,因此没有链接。对该数据的编辑通常无关紧要,因为它们很容易被撤消/丢弃。此外,如果有人开始编辑一行并被重要电话打断怎么办?您是否希望所有用户在此期间都被锁定?如果他们然后去吃午饭或被老板叫走怎么办?
-
是的,如果有人开始编辑一行,我想让其他用户无法对其进行编辑,即使这是在很长一段时间内。
-
最简单的解决方案可能是添加一个列(位),将行标记为处于编辑模式。一旦用户开始编辑,设置位 (1)。用户完成编辑后,设置位(0)
-
所以类似于这里接受的答案:stackoverflow.com/questions/21284271/… ?
标签: c# winforms postgresql ado.net