Как загрузить файл в BLOB без предварительной загрузки в оперативную память? - PullRequest
3 голосов
/ 29 марта 2010

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

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

Есть ли способ загрузить файл в двоичное поле без использования большого количества оперативной памяти, т.е. сначала не загружать файл в память?

Если это поможет, я использую Advantage Database Server, а это приложение winforms, а не веб-приложение.

Привет

Ответы [ 4 ]

5 голосов
/ 31 марта 2010

AdsExtendedReader.SetBytes можно использовать для загрузки большого двоичного объекта. Он инкапсулирует вызов AdsSetBinary (), о котором упоминал Джереми.

см. AdsExtendedReader.SetBytes .

2 голосов
/ 30 марта 2010

Вы можете напрямую использовать Advantage Client Engine (ACE) и вызвать API-интерфейс AdsSetBinary для установки большого двоичного объекта. Извините, у меня сейчас нет времени, чтобы написать пример для вас. Вам нужно будет добавить этот прототип в ваш файл c #:

[DllImport("ace32.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Winapi )]
              public static extern uint AdsSetBinary( IntPtr hTable, String pucFldName, ushort usBinaryType, uint ulTotalLength, uint ulOffset, byte[] pucBuf, uint ulLen );   

А вот ссылка на ссылку C API:

http://devzone.advantagedatabase.com/dz/webhelp/Advantage9.1/mergedProjects/ace/api2/adssetbinary.htm

Чтобы получить дескриптор для передачи API, см. Документацию AdsExtendedReader.AdsHandle.

Обновление: Я только что увидел ответ Алекса, и он лучше моего, я не знал, что мы уже обернули вызов AdsSetBinary методом .NET. Вы можете пометить его ответ как правильный ответ на этот вопрос. :)

0 голосов
/ 29 марта 2010

Я делал это перед использованием «UPDATE .WRITE». Я считывал фрагменты файла из потока и добавлял данные в поле базы данных. Искать .WRITE на этой странице: http://msdn.microsoft.com/en-us/library/ms177523.aspx.

К сожалению, это для SQL Server. Я думаю, что сервер баз данных Advantage будет немного отличаться, но, возможно, это направит вас в правильном направлении.

0 голосов
/ 29 марта 2010

Если вы не решите просто добавить ссылку в базу данных в том месте, где находится файл, он должен сначала пройти через память, поэтому id советует поискать решение, которое загружает файл x байтов за раз.

...