#mysql #delphi #blob
Пытаюсь загрузить файл в БД (MySQL), в blob-поле (маленькую, до 50kb картинку - формат
jpg).
Но вот что-то у меня идёт не так:
var
ImgPath: String;
begin
ImgPath:=ExtractFilePath(ParamStr(0))+'data\photo.jpg';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.ADD('UPDATE exam_users SET `photo`=(:fphoto) WHERE `number` = 94');
ADOQuery1.parameters.parambyname('fphoto').LoadFromFile(ImgPath, ftBlob);
ADOQuery1.ExecSQL;
ADOQuery1.Close;
end;
также пробовал и так:
var
ImgPath: String;
fs:TFileStream;
begin
ImgPath:=ExtractFilePath(ParamStr(0))+'data\photo.jpg';
fs :=TFileStream.Create(ImgPath, fmOpenRead or fmShareDenyWrite);
ADOQuery1.SQL.ADD('UPDATE exam_users SET `photo`=(:fphoto) WHERE `number` = 94');
ADOQuery1.Parameters.ParamByName('fphoto').LoadFromStream(fs, ftBlob);
ADOQuery1.ExecSQL;
fs.Free;
ADOQuery1.Close;
end;
Все эти два примера выдают одну ошибку:
Project Project2.exe raised exception class EOleException with message 'Аргументы
имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт
друг с другом'.
Ответы
Ответ 1
Что то мне подсказывает что тип поля не совсем ftBlob, я бы поэкспериментировал с другими значениями. Я так понимаю у Вас в базе тип поля text? При работе с потоком еще попробуйте установить позицию в 0. fs := TFileStream.Create... fs.Position = 0; На крайний случай можно написать как то так. ImgPath := ExtractFilePath(ParamStr(0))+'data\photo.jpg'; ADOQuery1.SQL.Text := 'select `photo` from exam_users where `number` = 94'; ADOQuery1.Open; TBlobField(ADOQuery1.FieldByName('photo')).LoadFromFile('c:\sample_2.jpg'); Но это не решает Вашу проблему. И если в базе есть уже данные, они сперва тянутся на клиент, а потом обновляются.Ответ 2
Вернулся снова в проекте к этому вопросу. Оказывается если в первом примере данное сообщение при компиляции проекта игнорировать, то всё прекрасно записывается в БД! А когда файл проекта скопмилирован и просто запускается на исполнение, то ни какого сообщения программа не выдаёт и всё срабатывает на 100%. Файл без каких-либо ошибок загружается в Blob-поле БД. Так что: ImgPath:=ExtractFilePath(ParamStr(0))+'data\photo.jpg'; ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.ADD('UPDATE exam_users SET `photo`=(:blob_photo) WHERE `number` = 94'); ADOQuery1.parameters.parambyname('blob_photo').LoadFromFile(ImgPath, ftBlob); ADOQuery1.ExecSQL; ADOQuery1.Close; работоспособный код.
Комментариев нет:
Отправить комментарий