1

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 );
    }
}

ありがとう。

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# コードを実行できるようになります。

EDIT 2: Google 検索を行ったところ、CodeProjectに関する記事が見つかりました。この記事では、BLOB データの圧縮と解凍を行っています。ここでの秘訣は、SqlBytesパラメーター タイプと単純な古い byte[] を使用することだと思います。以下は、記事と更新された質問を読んだ後に思いついた(テストされていない)コードです。

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 に答える