c# - 使用 PostgreSql 和 ADO.NET 在 C# WinForms 中锁定记录和表

标签 c# winforms postgresql ado.net

我正在使用 .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/

相关文章:

c# - 为什么将TextBox的Value重置为先前的值而不显示错误?

c# - 如何将多态引入实体数据模型

c# - 将 ctrl+c 发送到 c# 中的 cmd.exe 进程

postgresql - 如何从 jsonb 返回对象数组?

c# - UWP 10 C#。将文本文件读入列表<>

C# 线程 - 锁定对象

.net - Winform 富文本框 : How can I scroll the caret to the middle of the RichTextBox?

c# - 设置托盘图标始终显示

postgresql - 如何使用 extract(dow from date) 调整查询中的偏移量,使星期一为 0 - Postgres

c++ - PostgreSQL C API (libpq) 是否允许您使用结果而不是存储结果?