在SQL Server中存储blob,而不将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业务层。

你唯一能做到的就是从你的流中循环读取数据块&使用UPDATE .WRITEFILESTREAM对底层表进行更新。

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

我使用了这些资源:

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

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 <-解决这个bug,一个脚本来运行

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属性被删除

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

你不能流查询到SQL,所以它将读取参数作为流-因此,你需要在内存中整个文件。

没办法

相关内容

  • 没有找到相关文章

最新更新