SQL Сервер:Курсор большого двоичного объекта на стороне сервера?
-
20-08-2019 - |
Вопрос
я бы хотел прочитать двоичные данные из большого двоичного объекта, используя интерфейс Stream вокруг него.
Но я не хочу, чтобы большой двоичный объект загружался полностью на стороне клиента и сохранялся в памяти или в файле.
я хочу, чтобы код, использующий большой двоичный объект, мог выполнять поиск и чтение, и по проводу передавался только тот объем данных, который необходим для поддержки поиска / чтения.
т. е. Притворяйся большой двоичный объект представляет собой изображение Photoshop размером 250 МБ.Код программы создания эскизов знает, как прочитать первые 8 байт изображения, распознать, что это PSD-файл, выполнить поиск по смещению, которое будет содержать эскиз размером 3 кб, и прочитать его.
Таким образом, вместо того, чтобы пытаться выделить 250 МБ памяти или создавать временный файл и ждать, пока 250 МБ будут переданы по проводам:гипотетический класс SQLServerBlobStreamServerCursor знает, как передавать трафик данных к тому, что на самом деле запрашивается.
Исследования
Как сделать:Чтение и запись файла в столбец BLOB-объектов и из него с помощью разбиения на фрагменты в ADO.NET и Visual Basic .NET В котором говорится о том, чтобы уметь читать и писать по частям.Но код нечитаем, когда его вот так отрезают, я этого терпеть не могу.я посмотрю на это позже.
Также этот парень упоминался новый SQL Server 2005 [колонна.Write()]3 Синтаксис T-SQL для записи данных - может использоваться для записи данных небольшими порциями (чтобы избежать потребления всей памяти вашего сервера).Может быть, есть [колонна].Читать() псевдометод
У Microsoft есть статья: Экономия ресурсов при записи значений BLOB-объектов в SQL Server
Решение
В более новых версиях SQL Server вы можете просто использовать обычный SQL с функцией SUBSTRING() как для двоичных типов данных, так и для текста.Видишь http://msdn.microsoft.com/en-us/library/ms187748.aspx
Чтобы получить размер изображения:
select datalength(blobcolumn) from myimages where imgid = 12345;
Чтобы прочитать первые 8 байт:
select substring(blobcolumn, 1, 8) from myimages where imgid = 12345;
Чтобы прочитать 877 байт, выполните смещение с 115000 по 115876:
select substring(blobcolumn, 115001, 877) from myimages where imgid = 12345;
Помните, что функция substring основана на смещении на 1, а не на 0.
Если вы заботитесь о том, чтобы столбец потенциально менялся между его частями для чтения, вы можете поместить все различные выборки в транзакцию.
Я это не тестировал, но более старые версии MS SQL Server, по-видимому, требуют использования (теперь устаревшего) глагола READTEXT и функции TEXTPTR().Такие , как:
select textptr(blobcolumn) from myimages where imgid = 12345;
возьмите возвращаемое значение указателя, скажем PTR, и используйте его в последующих запросах:
readtext blobcolumn @PTR 115001 887
Другие советы
Вы можете рассмотреть возможность использования новой функции FileStream Sql Server 2008 для этого: http://msdn.microsoft.com/en-us/library/cc645940.aspx
Вы захотите использовать ADO.NET 's SqlDataReader
объект с SequentialAccess
Командное поведение.Это позволит вам определить размер буфера и считывать данные порциями.
Смотрите эту статью: http://msdn.microsoft.com/en-us/library/87z0hy49 (ПРОТИВ 71).aspx
byte[] outbyte;
int bufferSize = 8;
SqlDataReader myReader = myCmd.ExecuteReader(CommandBehavior.SequentialAccess);
...
long returnBytes = myReader.GetBytes(1, 0, outbyte, 0, bufferSize);