Aracılığıyla paylaş


İkili verileri alma

Şunlar için geçerlidir: .NET Framework .NET .NET Standard

ADO.NET indirin

Varsayılan olarak DataReader , tüm veri satırı kullanılabilir olduğunda gelen verileri satır olarak yükler. Ancak ikili büyük nesnelerin (BLOB'lar) farklı bir işleme ihtiyacı vardır, çünkü bunlar tek bir satırda içerilemeyen gigabaytlar kadar veri içerebilir. Command.ExecuteReader yönteminin, CommandBehavior argümanı alarak DataReader'ın varsayılan davranışını değiştirecek bir aşırı yüklemesi vardır. DataReader'ın varsayılan davranışını değiştirmek için SequentialAccess yöntemine geçirerek veri satırlarını yüklemek yerine alınan verileri sırayla yükleyebilmesini sağlayabilirsiniz. Bu, BLOB'ları veya diğer büyük veri yapılarını yüklemek için idealdir.

Uyarı

DataReader'ıSequentialAccess kullanacak şekilde ayarlarken, döndürülen alanlara hangi sırayla eriştiğinizi not etmek önemlidir. Kullanılabilir olduğunda satırın tamamını yükleyen DataReader'ın varsayılan davranışı, bir sonraki satır okunana kadar herhangi bir sırada döndürülen alanlara erişmenizi sağlar. Ancak SequentialAccess kullanırken , DataReader tarafından döndürülen alanlara sırayla erişmeniz gerekir. Örneğin, sorgunuz üç sütun döndürürse ve üçüncüsü BLOB ise, üçüncü alandaki BLOB verilerine erişmeden önce birinci ve ikinci alanların değerlerini döndürmeniz gerekir. Birinci veya ikinci alanlardan önceki üçüncü alana erişirseniz, birinci ve ikinci alan değerleri artık kullanılamaz. Bunun nedeni, SequentialAccess'inDataReader'ı verileri sırayla döndürecek şekilde değiştirmesi ve DataReader bunu okuduktan sonra verilerin tekrar kullanılamamasıdır.

BLOB alanındaki verilere erişirken, bir diziyi verilerle dolduran DataReader'ınGetBytes veya GetChars türündeki erişimcilerini kullanın. Karakter verileri için GetString de kullanabilirsiniz; ancak sistem kaynaklarını korumak için blob değerinin tamamını tek bir dize değişkenine yüklemek istemeyebilirsiniz. Bunun yerine, döndürülecek verilerin belirli bir arabellek boyutunu ve döndürülen verilerden okunacak ilk bayt veya karakterin başlangıç konumunu belirtebilirsiniz. GetBytes ve GetChars , döndürülen bayt veya karakter sayısını temsil eden bir long değer döndürür. GetBytes veya GetChars'a null bir dizi geçirirseniz, döndürülen uzun değer BLOB'daki toplam bayt veya karakter sayısı olur. İsteğe bağlı olarak, dizideki bir dizini okunacak veriler için başlangıç konumu olarak belirtebilirsiniz.

Example

Aşağıdaki örnek , pubs örnek veritabanından yayımcı kimliğini ve logosunu döndürür. Yayımcı kimliği (pub_id) bir karakter alanıdır ve logo da BLOB olan bir resimdir. Logo alanı bit eşlem olduğundan, örnek GetBytes kullanarak ikili veri döndürür. Alanlara sırayla erişilmesi gerektiğinden, logodan önce mevcut veri satırındaki yayımcı kimliğine erişildiğine dikkat edin.

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

Ayrıca bakınız