Для предпосылок к этому вопросу см., “Как я сериализирую большой график объекта.NET в SQL Server BLOB, не создавая большой буфер?” это теперь имеет большую щедрость на нем.
Я хочу смочь использовать Потоковый объект для данных чтения-записи к/от полю BLOB в строке SQL Server, не имея необходимость помещать все данные во временный буфер.
Если вышеупомянутое может быть сделано...
Поскольку Потоковый класс имеет партию
CanXXX()
методы, не все потоки могут использоваться всеми методами, берут, принимают потоковые исходные данные/выводы.Таким образом, насколько способный поток должен быть должен работать с ADO.NET при отправке данных в SQL Server?
Я надеюсь иметь стандартный Поток, к которому я могу передать его на другие API.
Также два ответа до сих пор только касаются получения формы данных SqlServer, не отправляя данные SqlServer.
Вот пример для чтения данных в кусках:
using (var conn = new SqlConnection(connectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "select somebinary from mytable where id = 1";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
byte[] buffer = new byte[1024]; // Read chunks of 1KB
long bytesRead = 0;
long dataIndex = 0;
while ((bytesRead = reader.GetBytes(0, dataIndex, buffer, 0, buffer.Length)) > 0)
{
byte[] actual = new byte[bytesRead];
Array.Copy(buffer, 0, actual, 0, bytesRead);
// TODO: Do something here with the actual variable,
// for example write it to a stream
dataIndex += bytesRead;
}
}
}
}
Вы не ставите все данные в буфер; Как правило, вы, как правило, выпускаете петлю, буферизующую несколько множественным из 8040 байтов (связанных с размером страницы), добавляя BLOB каждый раз Writetext
/ ReptateText
для Image
, или update.write
для varbinary (max)
. Вот старший пример (использует изображение
, извините).
Аналогично, при чтении данных вы, надеюсь, будут перекачивать данные в небольшом буфере в какой-то другой пункт назначения (ответ HTTP, сеть, файл и т. Д.). Что-то , как это (хотя я не совсем так, как он обрабатывает его eof / chanking; я бы проверил + ve bytes читать).