2016-04-19 9 views
1

SQL Serverのvarbinary(max)列に圧縮されたバージョンのバイト配列を書きたいと思います。GZipStreamからバイト配列または読み取り可能なストリームを取得する方法

私がSqlClientでのコマンドSqlBytes型のパラメータを供給したいと思い、そのためその型のインスタンス化に試してみました:

// data is a byte array at this point 
SqlParameter p7 = new SqlParameter("@bytes", Compress(data)); 
p7.SqlDbType = SqlDbType.VarBinary; 


public static SqlBytes Compress(byte[] input) 
{ 

    using (MemoryStream memstream = new MemoryStream(input)) 
    {  
     using (GZipStream zipped = new GZipStream(memstream, CompressionMode.Compress)) 
     {    
      return new SqlBytes(zipped);  
     }  
    } 
} 

をしかし、コマンドが「この操作はサポートされていません」というエラーで失敗します(以下のトレースを参照してください)。ですから、私は圧縮されたコンテンツをGZipStreamから、SqlBytes型のインスタンス化を可能にする形式にする必要があります。それはどうですか?

注:GZipStreamは読み取りをサポートしていないため、zipped.CopyTo(myOuputMemoryStream)は機能しません。

at System.IO.Compression.GZipStream.get_Length() 
at System.Data.SqlTypes.SqlBytes.get_Value() 
at System.Data.SqlClient.SqlParameter.BinarySize(Object value, Boolean isSqlType) 
at System.Data.SqlClient.SqlParameter.GetActualSize() 
at System.Data.SqlClient.SqlParameter.ValidateTypeLengths(Boolean yukonOrNewer) 
at System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters) 
at System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc) 
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest) 
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) 
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
at .Form1.Save2Database(Byte[] data) 

in c:\\Users\\foo\\Documents\\Visual Studio 2013\\Projects\\Test\\Test\\Form1.cs:line 228 

答えて

1

GZipStreamコンストラクタに渡すストリームは、データが圧縮(または圧縮解除)された形式で書き込まれるストリームです。空のメモリストリームを作成し、GZipStreamを使用してバイトを書き込む必要があります。

public static SqlBytes Compress(byte[] input) 
{ 

    using (MemoryStream memstream = new MemoryStream()) 
    {  
     using (GZipStream zipped = new GZipStream(memstream, CompressionMode.Compress)) 
     {    
      zipped.Write(input, 0, input.Length); 
     } 

     return new SqlBytes(memstream);    
    } 
} 
関連する問題