When dealing with varbinary(max)
, there are two scenarios:
- the length of the data is moderate
- the length of the data is big
GetBytes()
is intended for the second scenario, when you are using CommandBehaviour.SequentialAccess
to ensure that you are streaming the data, not buffering it. In particular, in this usage you would usually be writing (for example) in a stream, in a loop. For example:
// moderately sized buffer; 8040 is a SQL Server page, note
byte[] buffer = new byte[8040];
long offset = 0;
int read;
while((read = reader.GetBytes(col, offset, buffer, 0, buffer.Length)) > 0) {
offset += read;
destination.Write(buffer, 0, read); // push downstream
}
However! If you are using moderately sized data, then your original code:
byte[] data = (byte[])reader[col];
is fine!!. There is nothing wrong with this approach, and in fact the Get*
API is broken in a few cases - GetChar()
being a notable example (hint: it doesn't work).
It doesn't matter that you have existing code that uses Get*
- in this case, the cast approach is perfectly appropriate.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…