使用 Access 和 SQL Server 高效存储图像

kan*_*son 3 sql-server ms-access image

我目前正在开展一个项目,我将在 Microsoft SQL Server 中创建一个关系数据库,并使用 Access 作为用户输入信息的前端。

用户的请求之一是允许上传链接到特定记录的图像文件。

虽然我知道 Access 能够允许将图像文件等附件放入记录中,但从我所读到的内容来看,这似乎是一种非常低效的文件存储方式,从长远来看可能会降低性能。

我看到很多人建议将图像文件位置存储为实际条目,并将图像存储在文件系统上。

我的问题是是否有一个好的方法基本上允许用户通过 Access 上传图像,但将这些图像保存在文件系统上,并使记录自动转换为文件位置。(换句话说,文件将被自动保存并在特定文件夹中赋予一个ID,并且记录本身将包含文件路径)

我对其他想法持开放态度,只要它们仍然具有可扩展性并且高效工作。我已经看到了一些想法,例如将文件保存到带有自动生成想法的单独表中,但我不确定这是否会很好地工作。

任何建议都将不胜感激,无论这是否是通过 Access 或 SQL Server 实现相同类型结果的方法。我还知道如何在 Python3 中编写一些代码(如果这是实现这一目标的更简单的方法),但我尽可能希望最终用户能够通过一个界面实现所有功能。

Ami*_*ari 5

在 SQL Server 中,您可以选择将文件(图像等)作为数据库中的记录保存,并且 SQL Server 将此文件存储在文件系统中而不是数据库中。

通过这种方式你有一些好处:

  • 您的文件不会影响数据库文件大小
  • 您可以使用以下命令添加/删除文件T-SQL
  • 您可以轻松备份数据库和所有文件

对于这种方法,您需要file stream在数据库中启用。

您需要 3 个步骤来启用file stream

  1. 在服务级别启用文件流
  2. 在数据库中添加文件组
  3. 创建要存储的表

第一步(在服务级别启用文件流):

打开 SQL Server 配置管理器并选择您的数据库并启用文件流。

它的文档在这里

SQL Server 配置管理器

注意:如果找不到SQL Server Configuration Manager请参阅此文档

然后在 SQL Server Management Studio 中,单击“新建查询”以显示查询编辑器,并在查询编辑器中输入以下 Transact-SQL 代码并单击“执行”:

EXEC sp_configure filestream_access_level, 2  
RECONFIGURE 
Run Code Online (Sandbox Code Playgroud)

然后重新启动SQL Server服务注意:您可以在SQL Server Management Studio图形界面中执行此操作,如下所示:

配置文件流访问级别

第二步(在数据库中添加文件组):

  • 将文件组添加filestream到数据库

添加文件组

  • 添加数据库文件

添加文件流文件

或者您可以通过以下基于本文档的脚本来完成此操作:

CREATE DATABASE Archive 
ON
PRIMARY ( NAME = Arch1,
    FILENAME = 'c:\data\archdat1.mdf'),
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = Arch3,
    FILENAME = 'c:\data\filestream1')
LOG ON  ( NAME = Archlog1,
    FILENAME = 'c:\data\archlog1.ldf')
GO
Run Code Online (Sandbox Code Playgroud)

第三步(创建表并存储):

然后简单的步骤是创建表:

CREATE TABLE Archive.dbo.Records
(
    [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
    [Image] VARBINARY(MAX) FILESTREAM NULL
)
Run Code Online (Sandbox Code Playgroud)

注意:列类型[uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE是必需的,您的图像列类型应该是VARBINARY(MAX) FILESTREAM

然后您可以插入任何数据,如下所示,更多示例

INSERT INTO Archive.dbo.Records
    VALUES (newid (), 3, 
      CAST ('Seismic Data' as varbinary(max)));
Run Code Online (Sandbox Code Playgroud)

但如果你想使用MS Access,我认为最好的方法是将文件名存储在数据库中并通过编码来处理文件管理。