SQL Server: курсор BLOB на стороне сервера? - PullRequest
1 голос
/ 29 января 2009

Я хотел бы прочитать двоичные данные из большого двоичного объекта, используя интерфейс Stream вокруг него.

Но я не хочу, чтобы блоб загружался полностью на стороне клиента и сохранялся в памяти или в файле.

Я хочу, чтобы код, который использует большой двоичный объект, мог искать и читать, и только тот объем данных, который необходим для поддержки поиска / чтения, передается по проводам.

т.е. Притворись BLOB-объект - это изображение Photoshop объемом 250 МБ. Код thumbnailer знает, как прочитать первые 8 байтов изображения, распознать, что это PSD-файл, найти смещение, которое будет содержать миниатюру 3 Кб, и прочитать это.

Таким образом, вместо того, чтобы пытаться выделить 250 МБ памяти или создавать временный файл, и ждать, пока 250 МБ будут переданы по проводам: гипотетический класс SQLServerBlobStreamServerCursor знает, как передавать данные на то, что фактически запрашивается .


Research

КАК: Чтение и запись файла в и из столбца BLOB с помощью Chunking в ADO.NET и Visual Basic .NET Который говорит о способности читать и писать кусками. Но код не читается, будучи обрезанным таким образом, я не могу этого вынести. Я посмотрю на это позже.

Также этот парень упомянул новый SQL Server 2005 [ столбец .Write ()] 3 Синтаксис T-SQL для записи данных - может использоваться для записи данных в маленькие кусочки (чтобы не занимать всю память вашего сервера). Может быть, есть [ колонка ]. Чтение () псевдо-метод

У Microsoft есть статья: Сохранение ресурсов при записи BLOB-значений в SQL Server

Ответы [ 3 ]

2 голосов
/ 12 августа 2009

В более новых версиях 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;

Помните, что функция подстроки основана на 1-смещении, а не 0.

Если вы заботитесь о возможном изменении столбца между его частями чтения, вы можете поместить все различные варианты выбора в транзакцию.

Это не проверялось мной, но более старые версии MS SQL Server, по-видимому, требуют использования (сейчас устаревшего) глагола READTEXT и функции TEXTPTR (). Такие как:

select textptr(blobcolumn) from myimages where imgid = 12345;

получить возвращенное значение указателя, скажем, PTR, и использовать его в последующих запросах:

readtext blobcolumn @PTR 115001 887
1 голос
/ 13 декабря 2010

Для этого можно использовать новую функцию Sql Server 2008 FileStream: http://msdn.microsoft.com/en-us/library/cc645940.aspx

0 голосов
/ 29 января 2009

Вы захотите использовать объект SqlDataReader ADO.NET с SequentialAccess CommandBehavior. Это позволит вам определить размер буфера и прочитать данные кусками.

См. Эту статью: http://msdn.microsoft.com/en-us/library/87z0hy49(VS.71).aspx

byte[] outbyte;
int bufferSize = 8;
SqlDataReader myReader = myCmd.ExecuteReader(CommandBehavior.SequentialAccess);
...
long returnBytes = myReader.GetBytes(1, 0, outbyte, 0, bufferSize);
...