2009-09-06 2 views
1

Я использовал linq для sql для хранения файлов в поле varbinary(max). Filestream активируется тоже, но когда я пытаюсь хранить файлы с 400 или 500 МБ, я получаю эту ошибку:Проблема с хранением больших файлов в базе данных

Exception of type 'System.OutOfMemoryException' was thrown 

Мой код:

Dim ByteArray() As Byte = File.ReadAllBytes(OpenFileDialog1.FileName) 
Dim tb As New tb_1() 
tb._id = System.Guid.NewGuid() 
tb._Blob = New System.Data.Linq.Binary(ByteArray) 
tb._text = Date.Now 
db.tb_1s.InsertOnSubmit(tb) 
Dim tb2 As New tb_2 
tb2._id = System.Guid.NewGuid 
tb2._Master = tb._id 
tb2._text = 2 
db.tb_2s.InsertOnSubmit(tb2) 
db.SubmitChanges() 

Что может быть причина, почему я получаю это исключение и как я могу избежать этого?

+0

Где вы принимаете ошибку? Когда вы читаете в ByteArray или когда вы выполняете SubmitChanges? У меня была аналогичная проблема с чтением больших файлов, и я переключился на другой метод, чтобы читать байты и записывать их в файл, чтобы одновременно не иметь весь файл в памяти. Не знаете, как это сделать с необходимостью вставлять в БД, в моем случае я просто читал и писал файл. – Jay

+0

в этой строке: tb._Blob = New System.Data.Linq.Binary (ByteArray) У меня ошибка. –

ответ

0

Я думаю, вы можете использовать тип данных изображения (в SQL Server) для хранения больших файлов в вашей базе данных. Если вы используете другую СУБД, другую, что SQL Server, она должна иметь тип данных, эквивалентный типу данных изображения. Изображение массив байтов, поэтому вы не должны изменять свой код.

+0

Irelevant. SQL Server тоже может это сделать. Это чисто клиентская ошибка. – TomTom

1

Простой ответ: если ваш единственный инструмент - молоток, каждая проблема выглядит как гвоздь.

Linq2SQL - это устройство отображения O/R. это я не сделал для обработки hugh количества двоичных данных в объекте. Невозможно делать то, что вы хотите, как хотите. Drop Linq2SQL для этой конкретной части и использовать специальный синтаксис SQL для частичного чтения/записи (вы можете в основном писать только часть части blob/read blob, которую вы выполняете каждой командой SQK).

То же самое верно, кстати, для почти любого другого ORM там - хранилище BLOB - это не то, что вы имеете в виду при создании ORM (там было, сделано).