Я искал тот же ответ. Я нашел статью в EggHeadCafe, которая предлагает решение, использующее такую команду для чтения:
SELECT substring(DataColumn, @offset, @length) FROM BlobTable WHERE ID = @key
И такая команда для записи:
UPDATE BlobTable SET DataColumn.write(@buffer, @offset, @length) WHERE ID = @key
Полное решение (с пользовательским классом потока) можно найти здесь: http://www.eggheadcafe.com/software/aspnet/29988841/how-to-readwrite-chunked-to-varbinarymax-in-c.aspx.
Для моих целей, однако, я собираюсь использовать тип данных FileStream, который доступен с Sql Server 2008
. После того, как вы вставите запись (без двоичных данных), Sql Server выделяет физический файл на диске для чтения и записи данных записи. Затем вы запускаете команду, чтобы получить путь:
SELECT DataColumn.PathName() FROM BloblTable WHERE [Id] = @key
Получив это, вы можете читать и записывать в файл, используя традиционный потоковый класс, такой как System.IO.FileStream
.
Существуют значительные накладные расходы, но FileStream становится быстрее, когда файлы становятся больше (около 10 МБ). Для небольших файлов столбец FileStream можно рассматривать как столбец varbinary с гораздо меньшими накладными расходами. Эта статья в CodeProject объясняет детали: http://www.codeproject.com/KB/database/SqlFileStream.aspx