Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a: .NET Framework
.NET
.NET Standard
Por defeito, o DataReader carrega os dados recebidos em linha assim que uma linha inteira de dados está disponível. No entanto, objetos binários grandes (BLOBs) precisam de tratamento diferente, porque podem conter gigabytes de dados que não podem ser contidos em uma única linha. O método Command.ExecuteReader tem uma sobrecarga que usará um CommandBehavior argumento para modificar o comportamento padrão do DataReader. Pode passar SequentialAccess para o método ExecuteReader para modificar o comportamento padrão do DataReader , de modo que, em vez de carregar linhas de dados, ele carregue os dados sequencialmente à medida que são recebidos. Isso é ideal para carregar BLOBs ou outras grandes estruturas de dados.
Observação
Ao definir o DataReader para usar o SequentialAccess, é importante notar a sequência em que acede aos campos devolvidos. O comportamento padrão do DataReader, que carrega uma linha inteira assim que ela está disponível, permite que você acesse os campos retornados em qualquer ordem até que a próxima linha seja lida. No entanto, ao usar SequentialAccess deve aceder aos campos devolvidos pelo DataReader por ordem. Por exemplo, se sua consulta retornar três colunas, a terceira das quais é um BLOB, você deve retornar os valores do primeiro e segundo campos antes de acessar os dados BLOB no terceiro campo. Se você acessar o terceiro campo antes do primeiro ou segundo campos, os valores do primeiro e do segundo campo não estarão mais disponíveis. Isto deve-se ao facto de o SequentialAccess ter modificado o DataReader para devolver os dados em sequência e os dados não estarem disponíveis depois de o DataReader os ter lido além deles.
Ao aceder aos dados no campo BLOB, utilize os acessores tipados GetBytes ou GetChars do DataReader, que preenchem um array com dados. Também pode usar GetString para dados de caracteres; no entanto, para poupar recursos do sistema, pode não querer carregar um valor BLOB inteiro numa única variável de cadeia de caracteres. Em vez disso, você pode especificar um tamanho de buffer específico dos dados a serem retornados e um local inicial para o primeiro byte ou caractere a ser lido dos dados retornados.
GetBytes e GetChars devolvem um long valor que representa o número de bytes ou caracteres retornados. Se passar um array null para GetBytes ou GetChars, o valor longo devolvido será o número total de bytes ou caracteres no BLOB. Opcionalmente, você pode especificar um índice na matriz como uma posição inicial para os dados que estão sendo lidos.
Example
O exemplo seguinte devolve o ID do editor e o logótipo da base de dados de amostras de publicações. O ID do editor (pub_id) é um campo de caractere e o logotipo é uma imagem, que é um BLOB. Como o campo logótipo é um bitmap, o exemplo devolve dados binários usando GetBytes. Observe que o ID do editor é acessado para a linha atual de dados antes do logotipo, porque os campos devem ser acessados sequencialmente.
// Assumes that connection is a valid SqlConnection object.
SqlCommand command = new SqlCommand(
"SELECT pub_id, logo FROM pub_info", connection);
// Writes the BLOB to a file (*.bmp).
System.IO.FileStream stream;
// Streams the BLOB to the FileStream object.
System.IO.BinaryWriter writer;
// Size of the BLOB buffer.
int bufferSize = 100;
// The BLOB byte[] buffer to be filled by GetBytes.
byte[] outByte = new byte[bufferSize];
// The bytes returned from GetBytes.
long retval;
// The starting position in the BLOB output.
long startIndex = 0;
// The publisher id to use in the file name.
string pubID = "";
// Open the connection and read data into the DataReader.
connection.Open();
SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess);
while (reader.Read())
{
// Get the publisher id, which must occur before getting the logo.
pubID = reader.GetString(0);
// Create a file to hold the output.
stream = new System.IO.FileStream(
"logo" + pubID + ".bmp", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
writer = new System.IO.BinaryWriter(stream);
// Reset the starting byte for the new BLOB.
startIndex = 0;
// Read bytes into outByte[] and retain the number of bytes returned.
retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize);
// Continue while there are bytes beyond the size of the buffer.
while (retval == bufferSize)
{
writer.Write(outByte);
writer.Flush();
// Reposition start index to end of last buffer and fill buffer.
startIndex += bufferSize;
retval = reader.GetBytes(1, startIndex, outByte, 0, bufferSize);
}
// Write the remaining buffer.
writer.Write(outByte, 0, (int)retval);
writer.Flush();
// Close the output file.
writer.Close();
stream.Close();
}
// Close the reader and the connection.
reader.Close();
connection.Close();