为在同一文件中工作的多个用户寻求设计建议

Posted

技术标签:

【中文标题】为在同一文件中工作的多个用户寻求设计建议【英文标题】:Seeking Advice on Design for Multiple Users working in the same file 【发布时间】:2012-04-18 00:52:19 【问题描述】:

我正处于编写供多个用户使用的桌面应用程序的最早阶段。我正在寻找解决此问题的最佳方法的建议。

规范

我会将我的模型保存在一个文件中,该文件通常在映射的网络驱动器上使用。 (用于设计道路和其他线性特征,如铁路和溪流。)

各种最终用户需要能够同时连接和编辑文件。例如,Billy Bob 正在研究名为 US321 的道路,而 Rupert 正在研究 I40。每条道路的模型都存在于同一个文件中。最终用户可以“声明”任何道路名称,其中只有声明者可以编辑给定的道路。当比利鲍勃声称时,鲁珀特无法编辑 US321,但鲁珀特可以阅读 US321 以供参考。用户完成对道路数据的编辑后,他可以发布声明,其他人可以对其进行编辑。

序列化的限制?

我对序列化的理解非常有限(请参阅我的个人资料)。但在我看来,对象和序列化文件之间存在一对一的关联。因此,如果我使用序列化来实现这一点,就不可能只声明它的一部分,也不可​​能只更新它的一部分。 (这样对吗?如果不对,那我可以用序列化,对吧?)

我正在考虑的解决方案

我正在考虑使用 SQL Server Express,并且我对社区对此的警告、更正或确认感兴趣。

最终用户不必知道我在后台使用 SQL Server Express。 (我什至会将文件扩展名更改为适合我的应用程序的内容。)我会将道路加载到列表中,并且每条道路都是“可声明的”。声明一条道路将在数据库中标记它,以便应用程序的其他实例做出相应的反应,有点像它是一个共享的 MS Excel 文件,多人可以同时编辑,但(类似于 Excel)能够锁定个人工作表。

[编辑] 请参阅下面 Micah Armantrout 的内容丰富的回复。所以现在我想知道使用 Microsoft Access 作为中介数据库应用程序。

[编辑]

结论

感谢大家提供有用的答案和 cmets。 Micah 的回答非常有帮助,因为我没有意识到我会被限制为仅由一台服务器控制的文件。虽然现在说得很有道理,但我没有预料到,如果我走那条路,我会在朝那个方向工作几个小时后搁浅。

当我第一次阅读 urbadave 的想法时,我认为它是我已经考虑过但不喜欢的东西。但仔细想想,这显然是最简单的方法。我只是使用一个目录,就像它是一个文件一样,但对我的***子对象具有用户透明度。但显然,将我的整个模型封装到一个文件中是很有吸引力的。

所以这就是我决定做的事情:就像 urbadave 建议的那样,从写入目录开始。然后稍后测试将其放入 zip 目录并使用 ZipPackage 类提取并插入单独的序列化文件(或 XML 文件 - 我必须有一天做出另一个决定)。

保罗

【问题讨论】:

SQL 服务器或任何数据库引擎都可以做到这一点,你有行级锁定和可以以更简单的方式实现这一点的东西.. 是不是所有人都将在办公室连接到同一个网络,或者这种情况是否允许用户出去到“现场”然后返回办公室?因此,Access 2010 的新“离线”功能在这里可能会有很大用处。 @AlbertD.Kallal 每个人都同时连接。我目前不打算退房然后返回。 【参考方案1】:

SQL 服务器可以满足您的需求,但如果您要拥有多个用户,则需要将机器设置为服务器。 在每台机器上都安装 sql server express 对你没有任何好处 它可能是用户机器之一,也可能是一台带有 SQL server express 的实际服务器,你需要将其设置为可以在当前机器之外访问,按照本教程执行此操作。

如果您使用的是 Windows XP SP2 之前的版本,则需要按照这些说明打开防火墙的端口,这也在下面的链接中进行了讨论。

http://blogs.msdn.com/b/sqlexpress/archive/2005/05/05/415084.aspx

就共享数据而言,我的意思是看到其他人的工作。如果您不想在服务器上安装 sql server,您可以使用 MS Access,我会向您推荐一篇关于何时使用的文章

http://www.techrepublic.com/article/should-you-use-sql-server-express-edition-or-microsoft-access-for-your-small-business-applications/6140859

【讨论】:

好的。很高兴我问。 MS Access 没有此限制/拓扑模型。如果我改用 Access,我的计划会奏效吗? 您的意思是使用服务器?我应该问您是否希望用户共享数据? Micah,不,我的意思是无服务器。我希望用户能够随时读取文件中的所有数据。我们一直在 Access 中执行此操作,许多人将其作为标准安装的一部分。那么“共享数据”是指所有人都可以看到其他人的工作吗?答案是肯定的。如果你的意思是别的,请澄清。 访问在多用户场景中可靠。请参阅 ***.com/questions/763888/… 了解您应该避免使用它的一些原因。 只要您遵守简单的规则,访问在多用户场景中是完全可靠的。访问非常适合非常小的办公室。【参考方案2】:

虽然我可以在工作中访问一个不错的数据库,但我的大部分个人编程都不使用数据库。我过去使用的技巧之一是文件扩展名是为了传达意义。在您的情况下,您可以利用文件扩展名来指示声明并控制对主文件的写入。

您是对的,您可能希望将每个道路对象序列化到其自己的文件中。主文件将是包含所有这些单独道路对象的集合对象的序列化。

用户选择并打开这些道路文件。在打开文件之前,用户的应用程序会重新命名文件,添加扩展名(可能是用户的 id)。这样,您可以使用目录扫描来查找已声明和未声明的文件。

只有当用户在他们正在工作的道路上发布他们的声明时,才会写入主文件。用户的应用程序打开所有道路文件,使用道路对象组装一个主对象,然后将该对象序列化到主文件中。完成后,用户应用程序通过重命名来释放用户对道路文件的声明。

在写入主文件之前,用户的应用程序会重命名文件,表明它即将被写入。如果用户的应用程序需要写入,它可以检查文件是否被重命名,并等待文件名恢复为可写的名称。

这是我将如何攻击此规范的草图。祝你好运。

【讨论】:

感谢 urbadave。但是使用 ZipPackage 而不是目录作为对文件进行分组的一种方式呢?我可以使用文件属性来标记某些内容何时被要求编辑。 TIA 征求对此方法的意见。 我对 OPC 不太了解,所以我研究了一下。谢谢你让我接受它。我认为这是一个很好的解决方案!您使用文件系统来提供写锁定。使用 OPC 维护文档部分和主文档之间的关系。最重要的是,它已经内置在 .NET 中。

以上是关于为在同一文件中工作的多个用户寻求设计建议的主要内容,如果未能解决你的问题,请参考以下文章

verilog--关于将多个模块写在同一个源文件中的问题

可以在Visual Studio Community 2015/17和VS Team Services上禁用结帐文件功能

Firebase - 为啥不搜索在我的应用中工作的用户? (当用户输入两个字母时更新搜索控制器)

在 FF、IE6 和 IE7 中工作的 HTML 中垂直和水平居中的实用解决方案

创建在 IE 中工作的文件上传

SSIS ETL过程设计建议