Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Загрузка файла (картинки - jpg в BLOB-поле)

#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; работоспособный код.

Комментариев нет:

Отправить комментарий