4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
Откуда: Москва Всего сообщений: 2994 Рейтинг пользователя: 79 Дата регистрации на форуме: 29 сен. 2001
|
Профиль | Сообщить модератору | ИгнорироватьNEW! Сообщение отправлено: 5 апреля 2005 21:34
Столкнулся недавно с проблемой - нужно было сохранить произвольный файл в базу данных на 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 (я долго копался, прежде чем нашел эту функцию).
--- Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
|