read executereader example data c# .net vb.net ado.net sqldatareader

c# - executereader - ¿Qué parámetro de ''longitud'' debo pasar a SqlDataReader.GetBytes()



read data sqldatareader c# (2)

Cuando se trata de varbinary(max) , hay dos escenarios:

  • La longitud de los datos es moderada.
  • la longitud de los datos es grande

GetBytes() está diseñado para el segundo escenario, cuando está usando CommandBehaviour.SequentialAccess para asegurarse de que está transmitiendo los datos, no almacenándolos en el búfer . En particular, en este uso, normalmente estaría escribiendo (por ejemplo) en una secuencia, en un bucle. Por ejemplo:

// 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 }

¡Sin embargo! Si está utilizando datos de tamaño moderado, entonces su código original:

byte[] data = (byte[])reader[col];

¡¡está bien!! . No hay nada de malo en este enfoque, y de hecho, la API Get* se rompe en algunos casos, siendo GetChar() un ejemplo notable (sugerencia: no funciona).

No importa que tenga un código existente que use Get* ; en este caso, el enfoque de conversión es perfectamente apropiado.

Tengo un SqlDataReader y necesito leer una columna varbinary (max) usando el método SqlDataReader.GetBytes (). Este método rellena una matriz de bytes y, por lo tanto, necesita saber qué longitud de datos leer.

Aquí es donde me confundo ... Claramente, quiero leer todos los datos que se han devuelto desde la base de datos en esta fila / columna, ¿qué parámetro de "longitud" debo pasar?

Por lo que puedo ver, el SqlDataReader no proporciona ningún método para descubrir qué longitud de datos está disponible, por lo tanto, este método me parece bastante incómodo.

Estoy tentado a simplemente pasar int.MaxValue aquí y olvidarme del problema, pero algo sobre esto no me sienta bien.

Soy consciente de que en su lugar puedo llamar

byte[] value = (byte[])dataReader["columnName"];

.. y esto parece ocuparse completamente del problema de la longitud internamente. Sin embargo, estoy trabajando con un conjunto de plantillas de generación de código complicadas que se han construido alrededor de los métodos SqlDataReader.GetXXXX (). Así que estoy atado a usar GetBytes y necesito entender su uso correcto.


Probablemente podrías hacer esto. Encontrado en MSDN. Probablemente podría servirle a su propósito.

// Reset the starting byte for the new BLOB. startIndex = 0; // Read the bytes into outbyte[] and retain the number of bytes returned. retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize); // Continue reading and writing while there are bytes beyond the size of the buffer. while (retval == bufferSize) { bw.Write(outbyte); bw.Flush(); // Reposition the start index to the end of the last buffer and fill the buffer. startIndex += bufferSize; retval = myReader.GetBytes(1, startIndex, outbyte, 0, bufferSize); } // Write the remaining buffer. bw.Write(outbyte, 0, (int)retval - 1); bw.Flush();

http://msdn.microsoft.com/en-us/library/87z0hy49%28v=vs.71%29.aspx#Y132

O este

int ndx = rdr.GetOrdinal("<ColumnName>"); if(!rdr.IsDBNull(ndx)) { long size = rdr.GetBytes(ndx, 0, null, 0, 0); //get the length of data byte[] values = new byte[size]; int bufferSize = 1024; long bytesRead = 0; int curPos = 0; while (bytesRead < size) { bytesRead += rdr.GetBytes(ndx, curPos, values, curPos, bufferSize); curPos += bufferSize; } }