在SQL Server中存储blob而不将blob读入内存

时间:2011-07-22 10:06:06

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

我尝试完成的是从流中直接读取到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业务层中。

3 个答案:

答案 0 :(得分:1)

你能够做到这一点的唯一方法就是从你的流和循环中循环读取块。使用UPDATE .WRITEFILESTREAM发布基础表格的更新。

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

答案 1 :(得分:1)

我使用了这些资源:

http://lennilobel.wordpress.com/2011/01/23/sql-server-2008-filestream-part-3-of-3-using-the-opensqlfilestream-api-2/< - 要复制的或多或少准确的dotnet代码。

http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/03/filestream-configuration-and-setup-changes-in-sql-server-2008-february-ctp.aspx< - 在sqlserver中设置文件流,提到错误并引用解决方案

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中的drag'n'drop重新排序字段;字段上的filestream属性被删除。

答案 2 :(得分:0)

BLOB必须最终在将数据传递给SQL Server的进程的内存中,因为整个需要在调用时传入。

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

没办法。