#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; работоспособный код.
Комментариев нет:
Отправить комментарий