SQL Сервер:Курсор большого двоичного объекта на стороне сервера?

StackOverflow https://stackoverflow.com/questions/493000

  •  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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top