Объединенный Открытый Проект - Сайт для Настоящих Компьютерщиков

Объединенный Открытый Проект

Сайт для Настоящих Компьютерщиков

; Логин:
  Пароль:
Обычный
Безопасный
Запомнить пользователя



Зарегистрироваться
Забыли пароль?
 
 
 
Объединенный Открытый Проект »   Программирование »   Pascal/Delphi »   Вставка файла в BLOB-поле в MS SQL
RSS

Вставка файла в BLOB-поле в MS SQL

Как это делается

Текущий рейтинг темы: 1.0000

<<Назад  Модераторы: Winnowing_Raven, wsxПечать
 
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
Столкнулся недавно с проблемой - нужно было сохранить произвольный файл в базу данных на MSSQL, а потом извлечь его обратно. Сначала все было хорошо: я создал в таблице поле типа varimage (или просто image - не помню точно, как оно называется), но потом возникла проблема: как же сохранять файл в это самое поле.
Для подключения к БД я использую компоненты dbExpress и работаю с данными обычно с помощью запросов (результат того, что я долго писал на PHP, где других средств, в общем-то, и нет). Но с помощью запросов вставить файл никак не получалось: если я просто читал его и подставлял в строку, то SQL-сервер начинал ругаться на спецсимволы, а попытка заменить их конструкцией вида 'строка'+char(код_спецсимвола) приводил к тому, что у сервера переполнялся стек из-за большого количества операций сложения, да и тормозило это дело очень сильно.
В итоге решение было все-таки найдено: я использовал TSimpleDataSet, в котором есть функция создания BLOB-потока, в который я копировал данные из файлового потока. В результате получилось довольно быстро работающее решение, выглядящее примерно так:

    AlDataSet.Open;

    AlDataSet.Insert;

    AlDataSet.FieldByName('a_fid').AsInteger:=FIOId;

    AlDataSet.FieldByName('a_rid').AsInteger:=RIDs[Req.ItemIndex];

    AlDataSet.FieldByName('a_wid').AsInteger:=RsIDs[Receiver.ItemIndex];

    AlDataSet.FieldByName('a_data').AsDateTime:=Date.Date;

    AlDataSet.FieldByName('a_prichina').AsString:=Tema.Text;

    AlDataSet.FieldByName('a_number').AsInteger:=Number.Value;

    try

      Stream:=AlDataSet.CreateBlobStream(AlDataSet.FieldByName('a_file'),bmWrite);

      FStream:=TFileStream.Create(FilePath.Text,fmOpenRead);

      Stream.CopyFrom(FStream,FStream.Size);

    finally

      FStream.Free;

      Stream.Free;

    end;

    AlDataSet.Post;

    AlDataSet.ApplyUpdates(-1);


На всякий случай уточню, что Blob-поток Stream надо закрывать до отправки запроса, а сделанные в dataset'е изменения вносятся в БД по вызову ApplyUpdates (я долго копался, прежде чем нашел эту функцию).

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
<<Назад  Модераторы: Winnowing_Raven, wsxПечать
Объединенный Открытый Проект »   Программирование »   Pascal/Delphi »   Вставка файла в BLOB-поле в MS SQL
RSS
Быстрый переход в раздел:


Время выполнения скрипта: 0.0526. Количество выполненных запросов: 18, время выполнения запросов 0.0136