使用SQL Server 2008,我有一个接受VarBinary参数的存储过程。虽然参数在内存中,但我想将其写入SQL Server的%temp%目录。
如何从内存blob(它来自C#应用程序的byte [])转到文本文件?任何磁盘驻留表中都不存在blob。
我倾向于让TSQL sproc调用一个CLR存储过程,到目前为止看起来(大多数情况下)如下所示。
问题#1是我认为inputBytes []卡在8k输入大小。
问题#2是我似乎无法想出一些将varbinary值作为参数传递的体面SQL,因此我可以在Management Studio或VS DB单元测试中对此进行测试。
public static void FileWrite( string inputName , byte[] inputBytes )
using (FileStream fileStream = new
FileStream(Environment.GetEnvironmentVariable("TEMP") + "\\" + inputName,
FileMode.OpenOrCreate, FileAccess.Write))
{
using ( BinaryWriter binaryWriter = new BinaryWriter(fileStream))
{
binaryWriter.Write( inputBytes );
}
}
感谢。
答案 0 :(得分:0)
如果C#代码中有byte [],则可以轻松写入文件:
http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx
这对你有用吗?
编辑:如果必须从SQL Server启动文件保存,另一个想法可能是创建SQL Server CLR Function。这将允许您从SQL Server执行C#代码。
编辑2:我进行了Google搜索,并在CodeProject上找到了一篇文章。在文章中,他们正在压缩和解压缩blob数据。我认为这里的技巧是使用SqlBytes参数类型与普通旧字节[]。下面是我在阅读完文章和更新后的问题时提出的一些(未经测试的)代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.IO.Compression;
public partial class UserDefinedFunctions
{
// Setting function characteristics
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic=true, DataAccess=DataAccessKind.None)]
public static void fn_WriteToFile(string fileName, SqlBytes blob)
{
if( blob.IsNull || String.IsNullOrEmpty(fileName) )
{
return;
}
String fullFileName = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), fileName);
using( FileStream fileStream = new FileStream(fullFileName, FileMode.OpenOrCreate, FileAccess.Write))
using( BinaryWriter binaryWriter = new BinaryWriter(fileStream) )
{
binaryWriter.Write(blob.Buffer);
}
}
};
让我知道你的想法。