【问题标题】:How do I link the File Table with my existing table in SQL server如何将文件表与 SQL Server 中的现有表链接
【发布时间】:2017-11-25 04:27:49
【问题描述】:

我需要将员工图像保存在数据库中。我被要求使用文件表。在谷歌上搜索后,我得到了一些关于如何开始使用文件表的好内容。我设法创建了它们,将数据插入这些表就像复制/粘贴到指定的文件夹一样简单,数据被插入到表中。问题是我如何将每个员工行集与他们各自的图像联系起来

整个流程就像员工将通过前端上传他/她的图像或文档,这会将图像保存在服务器上。问题是如何添加员工的参考及其各自的形象。一种选择是在员工表中有一个 FileName 列,它引用 FileTable 中的 name 列,但我需要更有效的方法,例如关联 id。任何其他实现这一目标的方式将不胜感激。

【问题讨论】:

    标签: sql .net sql-server-2012


    【解决方案1】:

    首先,由于文件表是从 SQLSERVER 2012 开始引入的新功能,因此需要花费大量时间来解决问题。其次,这是我为解决我的问题而采取的方法。我将提供一些有用的链接,让其他开发人员的生活更轻松。希望对您有所帮助。

    文件表与普通的 SQL 表几乎相似,但需要进行一些配置才能启动它,因为它位于数据库的一个单独部分中,位于表 -->FIleTables 中。由于表结构是预定义的,因此您无法更改表架构。所以我采取的方法是将stream_id作为引用键来链接我想要使用的表,并通过存储过程处理约束逻辑。在我的场景中,Employee 表将有一个 stream_id 列,该列将通过 stream_id 链接到 File 表,为了使 File 表中的行唯一,我插入了 Employee Id 作为存储图像的名称,而不是实际名称文件。这样,即使有人尝试通过复制/粘贴直接插入文件,它也不会与 Employee 表有任何关系,您也可以提供访问权限以提供所需的权限。检查链接以获取更多详细信息。就是这样,通过一些调整,我能够解决我的问题。 下面的 SQL 脚本将有助于一次性激活实例级别的文件流。

    EXEC sp_configure filestream_access_level, 2
    RECONFIGURE
    GO
    
    --For new DB
    CREATE DATABASE <DATABASE name>
    WITH FILESTREAM
    ( 
    NON_TRANSACTED_ACCESS = FULL,
    DIRECTORY_NAME = N'<DIRECTORY name>'
    );
    GO
    
    --If you have an existing DB
    ALTER DATABASE <DATABASE name>
    ADD FILEGROUP <File group name> 
    CONTAINS FILESTREAM
    GO
    
    ALTER DATABASE <DATABASE name>
    ADD FILE (NAME='<File group name>', FILENAME='<DIRECTORY name>')
    TO FILEGROUP <File group name>
    GO
    
    ALTER DATABASE <DATABASE name>
    SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'<File 
    group name>')
    GO
    
    use <DATABASE name>
    GO
    CREATE TABLE <Filetable NAME> AS FileTable;
    GO
    

    还有一些非常有用的链接:

    https://www.mssqltips.com/sqlservertip/2667/filetable-feature-in-sql-server-2012/

    http://sql-articles.com/articles/general/working-with-filetables/

    https://michaelfirsov.wordpress.com/working-with-sql-server-file-tables-part-1/

    https://michaelfirsov.wordpress.com/working-with-sql-server-file-tables-part-2/

    https://msdn.microsoft.com/pl-pl/library/gg492084(v=sql.110).aspx

    谢谢。

    【讨论】:

    • 我发现当你更改文件的内容时,stream_id 会发生变化。我认为最好使用路径定位器作为文件表的键
    • @keuleJ stream_id 在文件内容更改时不会更改。我刚刚测试了 3 次更改文本文件的内容并比较了每个 stream_id。无论内容如何,​​每次更改后都相同。
    【解决方案2】:

    在雇主和文件表之间建立一个“连接(多对多)表”不是很容易吗?您不必将其用作多对多表。将其命名为 EmployeeImages 并添加描述属性/属性,即“招聘照片”、“刚刚被解雇的照片”。来自员工和文件表的主键。简单!

    【讨论】:

      【解决方案3】:

      您必须在程序中插入复制文件的代码。 File.Copy(...) 而不是仅仅复制和粘贴到文件系统中。 这样,您的 File.Copy 执行的每个实例,您都可以获得其各自的 stream_id,然后您将其附加到您的员工表上。..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        • 2019-10-19
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多