Winforms Document Manager使用Filesystem& SQL数据库

时间:2011-06-28 22:59:12

标签: c# .net sql vb.net winforms

我正在尝试为winforms应用程序创建文档管理器。它不是基于网络的。

我希望能够允许用户在我的应用程序中将文档“附加”到各种实体(人员,公司,工作单,任务,批处理部件等)。

经过大量研究后,我决定使用文件系统来存储文件而不是SQL中的blob。我将设置一个文件夹来存储所有文件,但我会将文件信息(文件路径,上传,更改,修订等)与父子关系存储在sql数据库中。

我只希望用户能够通过应用程序处理文档,以防止文件和数据库记录不同步。我有些人需要保护文档文件夹免受普通用户的影响,但同时允许应用程序使用它。我最初的想法是使用唯一的用户名和密码设置应用程序并访问该文件夹,并使用模拟登录该文件夹并使用这些文件。根据我最近开始的一个帖子中的反馈,我现在相信这不是一个好主意,并且模仿一直很头疼。

我还考虑过使用网络服务,但我们的一些客户只是在没有Windows服务器的笔记本电脑上运行应用程序。大多数人使用的是Windows服务器或citrix / windows服务器。

设置此项的最佳方法是什么,以便只有应用程序处理文档?

3 个答案:

答案 0 :(得分:3)

我知道你说你读过blob,但是你知道SQL Server 2008及其后的FILESTREAM选项吗?基本上而不是将blob保存到数据库中并不总是一个好主意,您可以使用事务NTFS将blob保存到NTFS文件系统。这对我来说听起来就像你想要实现的那样。

所有文件访问安全性都将通过SQL服务器处理(因为它是唯一需要访问该文件夹的东西),并且您不需要编写自己的逻辑来添加和删除文件系统中的文件。要从文件系统中删除文件,只需删除sql server表中的相关记录,然后处理从文件系统中删除它。

请参阅:

http://technet.microsoft.com/en-us/library/bb933993.aspx

答案 1 :(得分:2)

选项1(简单):通过晦涩安全

让每个人都阅读(并根据需要编写)访问您的文档目录。将文档“路径”保存为完整URI(\\ servername \ dir1 \ dir2 \ dir3 \ file.ext),以便您的用户可以访问这些文件,但如果有人在其映射的驱动器中漫游,则它们不会立即可用。

选项2(更难):从SQL Server提供文件

您可以使用CLR函数或SQLDMO从磁盘读取文件,将其显示为varbinary字段并在客户端重构它。好处是你的用户会看到一个副本,而不是真实的东西;使观看更安全,编辑和节省更多。

享受! ; - )

答案 2 :(得分:1)

我会选择这些选项,没有特别的顺序。

  1. 在服务器上创建一个用户无法访问的文件夹。在服务器上运行Web服务(使用IIS或独立的WCF应用程序),该服务具有上传和下载的方法。下载文件。您的Web服务应该管理存储文件的目录。 SQL数据库应具有查找文档所需的所有元数据。通过这种方式,只有您的应用可以访问这些文件。因此,用户只能通过应用程序查看文档。

  2. 我可以看到您选择将文档存储在文件系统中。我写了一个类似的系统(例如客户/订单/销售人员等的附件......),除了我将它存储在SQL Server中。它实际上运作得很好。我最初担心这么多数据会减慢数据库的速度,但结果并非如此。它工作得很好。如果采取这种方法,我可以给出的唯一建议是为所有附件创建一个单独的数据库。为什么?因为如果您想获得本地测试的RDBMS副本,您不希望复制由1GB实际数据和299GB附件组成的300GB数据库。

  3. 您提到您的部分用户将携带笔记本电脑。在这种情况下,它们可能没有连接到LAN。如果是这种情况,我会考虑将文件(可能还有元数据本身)存储在云端(EC2,Azure,Rackspace等)。