我尝试完成的是从流直接读取到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 .WRITE
或FILESTREAM
对底层表进行更新。
这应该不需要任何比常规更新/插入更多的权限
我使用了这些资源:
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,所以它将读取参数作为流-因此,你需要在内存中整个文件。
没办法