我尝试完成的是从流中直接读取到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业务层中。
答案 0 :(得分:1)
你能够做到这一点的唯一方法就是从你的流和循环中循环读取块。使用UPDATE .WRITE
或FILESTREAM
发布基础表格的更新。
这不应该需要比常规更新/插入更多的权限。
答案 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://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,因此它会将参数作为流读取 - 因此,您需要将整个文件存储在内存中。
没办法。