3

我有一个连接到 SQL Server 的标准 WinForms 应用程序。该应用程序允许用户将当前存储在数据库中的文档上传到使用图像列的表中。

我需要更改这种方法,以便将文档存储为文件,并将文件的链接存储在数据库表中。

使用当前的方法——当用户上传一个文档时,他们被屏蔽了它的存储方式,因为他们与数据库有连接,他们不需要知道文件存储在哪里,也不需要特殊的目录权限等。如果我为文档设置网络共享,我想避免任何 IT 问题,例如用户必须有权访问此目录才能上传或访问现有文档。

有哪些可用的选项来执行此操作?我想有一个临时数据库,以与当前方法相同的方式将文档上传到其中,然后在服务器上运行一个进程以将这些文件保存到文件存储中。然后可以删除并重新创建该数据库以回收任何空间。有没有更好的方法?

附加信息: 我的应用程序没有 Web 服务器元素,所以我认为 WCF 服务是不可能的

4

3 回答 3

2

您是否有理由首先要从数据库中取出文件?

如何仍然将它们保存在 SQL Server 中,但使用FILESTREAM而不是IMAGE

引用链接:

FILESTREAM 使基于 SQL Server 的应用程序能够在文件系统上存储非结构化数据,例如文档和图像。应用程序可以利用文件系统的丰富流 API 和性能,同时保持非结构化数据和相应结构化数据之间的事务一致性。

FILESTREAM 通过将 varbinary(max) 二进制大对象 (BLOB) 数据存储为文件系统上的文件,将 SQL Server 数据库引擎与 NTFS 文件系统集成。Transact-SQL 语句可以插入、更新、查询、搜索和备份 FILESTREAM 数据。Win32 文件系统接口提供对数据的流式访问。

FILESTREAM 使用 NT 系统缓存来缓存文件数据。这有助于减少 FILESTREAM 数据可能对数据库引擎性能产生的任何影响。未使用 SQL Server 缓冲池;因此,该内存可用于查询处理。

因此,您将获得两全其美:
文件将作为文件存储在硬盘上(与将它们存储在数据库中相比可能更快),但您不必关心文件共享、权限等。

请注意,您至少需要 SQL Server 2008 才能使用FILESTREAM.

于 2012-05-17T13:50:06.560 回答
1

我可以告诉你我是如何实现这个任务的。我编写了一个 WCF 服务,用于发送存档文件。所以,如果我是你,我会创建这样一个服务,它应该能够保存文件并将它们发回。这很容易,您还必须确保 WCF 服务工作的用户具有读写文件的权限。

于 2012-05-17T13:47:05.160 回答
1

您可以让您的应用程序将对象传递给数据库中的一个过程(可能是 CLR),然后将数据写入您选择的位置,而不存储文件内容。这样你在文件存储和应用程序之间仍然有一个抽象层,但你不需要有一个在你之后清理的过程。

或者,可以创建应用程序连接到的 WCF/Web 服务。可以使用 Web 方法来接受文件内容并将它们写入正确的位置,它可以返回文件的路径或某些文件标识符。

于 2012-05-17T13:48:30.960 回答