1

在 SQL Server 2008 中,我有一个接受 VarBinary 参数的存储过程。当参数在内存中时,我想将它写入 SQL Server 的 %temp% 目录。

如何从内存 blob(它来自 C# 应用程序的字节 [])到文本文件?该 blob 不存在于任何磁盘驻留表中。

我倾向于让 TSQL sproc 调用 CLR 存储过程,到目前为止看起来(大部分)如下所示。

问题 #1 是我认为 inputBytes[] 卡在 8k 输入大小。

问题 #2 是我似乎无法想出一些像样的 SQL 将 varbinary 值作为参数传递,因此我可以在 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 );
    }
}

谢谢。

4

1 回答 1

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:我进行了谷歌搜索,发现了一篇关于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);
        }
    }
};

让我知道你的想法。

于 2011-01-12T03:38:31.923 回答