【问题标题】:Store blob in SQL Server without reading the blob into memory在 SQL Server 中存储 blob 而不将 blob 读入内存
【发布时间】:2011-10-10 22:26:09
【问题描述】:

我尝试完成的是从流中直接读取到 SQL Server 中的字段/记录

将文件保存到 SQL Server 并不难,互联网上有很多示例;
但我找不到任何不首先将整个文件读入内存的示例

例如:

byte[] data = BinaryReader.ReadBytes((int)filestream.Length);
cmd.Parameters.Add("@Data", SqlDbType.Image, data.Length).Value = data;

或类似的东西。

我可以使用 SQL Server 自己的命令,但是我必须摆弄 SQL Server 从另一台机器/文件夹读取的权限,我希望将其全部保存在 .NET 业务层中。

【问题讨论】:

    标签: .net sql-server sql-server-2008 stream blob


    【解决方案1】:

    您能够做到这一点的唯一方法是循环读取流中的块并使用UPDATE .WRITEFILESTREAM 在基础表上发布更新。

    这应该不需要比常规更新/插入更多的权限。

    【讨论】:

    • 谢谢。请参阅我自己的资源答案。
    【解决方案2】:

    我使用了这些资源:

    http://lennilobel.wordpress.com/2011/01/23/sql-server-2008-filestream-part-3-of-3-using-the-opensqlfilestream-api-2/

    http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/03/filestream-configuration-and-setup-changes-in-sql-server-2008-february-ctp.aspx

    http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/06/09/enabling-filestream-post-sql2008-setup-a-known-issue-in-sql-config-manager.aspx

    http://sqlsrvengine.codeplex.com/wikipage?title=FileStreamEnable&referringTitle=Home&ProjectName=sqlsrvengine

    (http://www.mssqltips.com/tip.asp?tip=1489 // 有点太老了,有一些错误的名字)

    让我通过。
    我交换了将数据推送到 Web 浏览器(或读取到 RAM)的功能,以便使用以下代码将其保存到文件中:

        private static void CopyFile(string sourcePath, byte[] transToken, string targetPath, Guid uid)
        {
            //  Should we use a buffer here?  I mean - does this firehose use memory according to the file size?  If so - use a buffer and copy piece by piece.
            SafeFileHandle handle = NativeSqlClient.GetSqlFilestreamHandle(sourcePath, NativeSqlClient.DesiredAccess.Read, transToken);
            using (var fileSource = new FileStream(handle, FileAccess.Read))
            {
                using (var fileDest = new FileStream(Path.Combine(targetPath, uid.ToString()), FileMode.CreateNew, FileAccess.Write))
                {
                    fileSource.CopyTo(fileDest);
                    fileDest.Flush();
                    fileDest.Close();
                }
                fileSource.Close();
            }
        }
    

    如果您使用上述 LLobel 网站上的代码,您会发现在哪里插入调用此方法。

    另请注意,不能通过在 SQLServermanagementstudio 中拖放来重新排序字段;字段上的 filestream 属性被删除。

    【讨论】:

      【解决方案3】:

      BLOB 必须在将数据传递到 SQL Server 的进程的内存中结束,因为它需要在调用时传入。

      您无法将查询流式传输到 SQL,因此它将参数作为流读取 - 因此,您需要将整个文件存储在内存中。

      没办法。

      【讨论】:

      • 我没有为
      猜你喜欢
      • 2021-02-28
      • 2019-07-18
      • 1970-01-01
      • 2013-02-26
      • 2019-05-01
      • 2018-04-13
      • 2017-04-28
      • 2021-04-02
      • 2020-08-23
      相关资源
      最近更新 更多