Как вставить файл (PDF) в varbinary столбец SQL Server, а затем извлечь его? - PullRequest
5 голосов
/ 14 января 2009

Я собираюсь взять результаты прогона отчета (PDF-файл из Crystal Reports), сериализовать его, вставить в поле varbinary, а затем иметь возможность десериализовать и представить его обратно пользователю.

Пока что мне нужно просто старую ADO .NET (SqlClient, SqlCommand и т. Д.)

Есть ли подводные камни в этом? Каков основной синтаксис для достижения этой цели, учитывая тот факт, что я знаю путь на локальном компьютере, на котором в данный момент сохранен файл PDF?

Ответы [ 2 ]

5 голосов
/ 14 января 2009

РЕДАКТИРОВАТЬ: Как видно из документации MSDN , что Изображение будет удалено . Лучше использовать VARBINARY (MAX). (Эй, я этого не знал).

МОЙ СТАРЫЙ ОТВЕТ: VARBINARY имеет ограничение в 8 КБ. Может быть слишком маленьким для хранения PDF. Вам лучше использовать тип данных IMAGE.

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

Данные, которые вы передаете в поле изображения, представляют собой массив байтов.

Редактировать 2: Поскольку вы используете C #, вы должны получить данные с помощью DataReader. Чтобы создать DataReader, используйте флаг SequentialAccess на SqlCommand.ExecuteReader , чтобы предотвратить слишком раннее чтение данных в память.

3 голосов
/ 15 января 2009

Я бы вообще не использовал параметр byte[] для IDbCommand. Что если ваш PDF размером 100 Мб? Насколько я знаю, это получило бы все эти 100 Мб из вашей базы данных (нуждающихся в таком количестве памяти на вашем сервере) перед отправкой результата запрашивающему браузеру. Теперь подумайте о том, чтобы получать несколько одновременных запросов для разных PDF-файлов примерно такого размера ... в секунду ... Это не очень масштабируемо.

Для возможного решения, пожалуйста, прочитайте "Blob + Stream = BlobStream" , статью, которую я написал для .NET Magazine здесь, в Нидерландах пару лет назад. Этот метод использует команды SQL Server для доступа к частям BLOB из Stream производного класса.

Статья написана на голландском языке, но пример кода , который идет с ней, должен быть достаточным для начала работы. Кроме того, Питер Де Йонге, кажется, написал статью о CodeProject , которая немного расширяет мою статью, обобщая ее не только для image столбцов в SQL Server. Эта статья на английском языке.

Надеюсь, это поможет вам решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...