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