Sdílet prostřednictvím


Načtení binárních dat

Platí pro: .NET Framework .NET Standard

Stáhnout ADO.NET

Ve výchozím nastavení dataReader načte příchozí data jako řádek, jakmile bude k dispozici celý řádek dat. Binární velké objekty (BLOB) však potřebují jinou léčbu, protože můžou obsahovat gigabajty dat, která nemohou být obsažena v jednom řádku. Metoda Command.ExecuteReader má přetížení, které přijme argument CommandBehavior pro úpravu výchozího chování DataReader. Můžete předat SequentialAccess k metodě ExecuteReader tak, aby upravila výchozí chování DataReader, takže místo načítání řádků dat bude načítat data postupně, jakmile jsou přijata. To je ideální pro načítání objektů BLOB nebo jiných velkých datových struktur.

Poznámka:

Při nastavování Čtečky dat pro použití sekvenčního přístupu je důležité poznamenat posloupnost, ve které přistupujete k vrácených polím. Výchozí chování třídy DataReader, které načte celý řádek, jakmile je k dispozici, umožňuje přístup k polím vráceným v libovolném pořadí, dokud nebude přečten další řádek. Při použití sekvenčního přístupu však musíte přistupovat k polím vráceným Čtečkou dat v pořadí. Pokud například dotaz vrátí tři sloupce, třetí z toho je objekt BLOB, musíte před přístupem k datům objektu blob ve třetím poli vrátit hodnoty prvních a druhých polí. Pokud přistupujete ke třetímu poli před prvním nebo druhým polem, hodnoty prvního a druhého pole už nebudou k dispozici. Je to proto, že SequentialAccess upravil Čtečku dat tak, aby vracela data v sekvenci, a data nejsou k dispozici poté, co Čtečka dat přešla přes ně.

Při přístupu k datům v BLOB poli použijte typové přístupové metody GetBytes nebo GetChars třídy DataReader, které naplní pole daty. Můžete také použít GetString pro znaková data; Pokud ale chcete šetřit systémové prostředky, možná nebudete chtít načíst celou hodnotu objektu BLOB do jedné řetězcové proměnné. Místo toho můžete zadat konkrétní velikost vyrovnávací paměti dat, která se mají vrátit, a počáteční umístění prvního bajtu nebo znaku, který se má číst z vrácených dat. Funkce GetBytes a GetChars vrátí long hodnotu, která představuje počet vrácených bajtů nebo znaků. Pokud předáte nulové pole GetBytes nebo GetChars, bude vrácená hodnota typu long celkový počet bajtů nebo znaků v objektu BLOB. Volitelně můžete v poli zadat index jako výchozí pozici pro čtení dat.

Example

Následující příklad vrátí ID vydavatele a logo z ukázkové databáze pubs. ID vydavatele (pub_id) je znakové pole a logo je obrázek, který je uložen jako BLOB. Vzhledem k tomu, že pole s logem je rastrový obrázek, vrátí příklad binární data pomocí metody GetBytes. Všimněte si, že ID vydavatele je přístupné pro aktuální řádek dat před logem, protože pole musí být přístupná postupně.

// 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();

Viz také