我正在使用 .NET Framework 4.6.1、WinForms、PostgreSQL 6.4beta4 和 Npgsql 以及 ADO.NET。
我当前的应用程序是一个多用户应用程序,所有用户都连接到同一个数据库。
数据通过使用 DataTable、BindingSource 和 BindingNavigator 绑定(bind)到控件。
我想避免两个用户可以同时编辑一个 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 经验的人可以帮助我,我将不胜感激。谢谢。
最佳答案
您必须同步您的客户端才能实现这一点。
我会添加一个额外的可为 null 的日期列 (RowIsBeeingEdited),指示该行开始被编辑的时间。我会在客户端应用程序开始时将行设置为可编辑/不可编辑 [RowIsBeeingEdited] 值。
我还会实现两个信号:{UserStartedEditingRow} 和 {UserFinishedEditingRow},它们会传播到所有客户端,表明客户端 X 开始/完成编辑行 Y .
在开始编辑行时,我会设置 row[RowIsBeeingEdited] = {now} 并发送 {UserStartedEditingRow} 信号。在结束编辑时,我会设置 row[RowIsBeeingEdited] = null 并发送 {UserFinishedEditingRow} 信号。当前活跃的客户端应该收到这两个信号并设置行可编辑/不可编辑。
希望这有一些值(value)。
关于c# - 使用 PostgreSql 和 ADO.NET 在 C# WinForms 中锁定记录和表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39039365/