を SqlServerからストリーム形式で読み取る必要がある場合は、そのための機能がいくつかあります。一つのデータをを供給する必要がある場合、逆方向にデータをストリーミング約SqlBulkCopyが使用されている場合、バイナリ列のデータソースとしてストリームを供給
var cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = @"select 0xas Data";
using (var dr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
dr.Read();
var stream = dr.GetStream(0);
// access stream
}
しかし:そのようなバイナリ列データにアクセスする必要がある場合に特にCommandBehavior.SequentialAccess
とSqlDataReader
を使用して、としてGetStream(int)
その方法があります SqlServer SqlBulkCopy
を使用し、特にストリームをバイナリ列のデータソースとして指定する必要がある場合は、私はどこTestDataReader
実装IDataReader
として
var cmd2 = new SqlCommand();
cmd2.Connection = connection;
cmd2.CommandText = @"create table #Test (ID int, Data varbinary(max))";
cmd2.ExecuteNonQuery();
using (SqlBulkCopy sbc = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null))
{
sbc.DestinationTableName = "#Test";
sbc.EnableStreaming = true;
sbc.ColumnMappings.Add(0, "ID");
sbc.ColumnMappings.Add(1, "Data");
sbc.WriteToServer(new TestDataReader());
}
を、次の試してみました
は次のとおりです。
class TestDataReader : IDataReader
{
public int FieldCount { get { return 2; } }
int rowCount = 1;
public bool Read() { return (rowCount++) < 3; }
public bool IsDBNull(int i) { return false; }
public object GetValue(int i)
{
switch (i)
{
case 0: return rowCount;
case 1: return new byte[] { 0x01, 0x23, 0x45, 0x67, 0x89 };
default: throw new Exception();
}
}
//the rest members of IDataReader
}
と期待どおりに働いていたが。
しかしながら
case 1: return new MemoryStream(new byte[] { 0x01, 0x23, 0x45, 0x67, 0x89 });
に
case 1: return new byte[] { 0x01, 0x23, 0x45, 0x67, 0x89 };
を変更は がVARBINARY型に変換できないメッセージ
データ・ソースからの型のMemoryStreamの所定の値と例外
System.InvalidOperationException
を引き起こし指定されたターゲット列の
バイナリ列のデータのソースとしてSqlBulkCopy
にIDataReader
(又はおそらくDbDataReader
)からStream
を供給するための方法は、最初のメモリ(バイト配列)にすべてのデータをコピーせずに、ありますか?
参照のWebページ:https://msdn.microsoft.com/en-us/library/system.data。sqlclient.sqlbulkcopy(v = vs.110).aspx – jdweng
カスタムIDataReaderでこれを行うには興味がありますか、実際には既存のデータリーダー(SqlDataReaderなど)を使用しますか? – Evk
@Evk、カスタム 'IDataReader'または' DbDataReader'(私はバイナリ/ xmlファイルからデータをフィードするカスタム実装を使用していますが、私の質問のようないくつかのダミーの実装で十分です)。 –