-
Знатоки, подскажите! Возможно ли запихать SQL - запросом содержимое TImage (bmp, jpg) в базу и вытянуть опять же SQL-запросом обратно???
D7, база MsSQL.
Заранее пасибо.
-
Конечно можно.
-
> Возможно ли запихать SQL - запросом содержимое TImage (bmp, > jpg) в базу и вытянуть опять же SQL-запросом обратно???
Насчет SQL не знаю, может в MSSQL как-то и можно. В Delphi традиционно это делается с помощью методов SaveToStream() и LoadFromStream() класса TBlobField (здесь возможны и другие варианты).
-
> Johnmen © (04.07.08 19:13) [1] > Конечно можно.
А можно как то по подробнее???
-
Берём содержимое TImage, запихиваем его в параметр параметрического запроса, выполняем запрос. Выполняем запрос на вытягивание желаемого, наполняем содержимое TImage вытянутым.
-
> Johnmen © (04.07.08 19:46) [4] > Берём содержимое TImage, запихиваем его в параметр параметрического > запроса, выполняем запрос. > Выполняем запрос на вытягивание желаемого, наполняем содержимое > TImage вытянутым.
На счет второго абзаца разобрался, Form1.Image1.Picture.Assign(TBlobField(Query.FieldByName('Photo'))); А вот с первым, по поводу "запихиваем" - не получается. Пробую так: Query.Parameters[2].DataType := ftGraphic;
Query.Parameters[2].Assign (Form1.Image1.Picture.Bitmap); В этом случае в базу что то записывается, но при запросе содержимого прога его не понимает и выдает чистый Image. Если так: Query.Parameters[2].DataType := ftGraphic;
Query.Parameters[2].LoadFromFile ('D:\photo.bmp', ftGraphic); или Table.Edit;
TBlobField(Table.FieldByName('Photo')).LoadFromFile('D:\Photo.bmp');
Table.Post; опять же ,все вроде выполняется, но при попытке загрузить картинку из базы, даже через DBImage возникает ошибка "Bitmap image is not valid" Знатоки, кто-нибудь, помогите разобраться???
-
> ftGraphic
не надо так, используй ftBlob
-
Использовал. После записи бмп в базу Query.Parameters[2].DataType := ftBlob;
Query.Parameters[2].LoadFromFile ('D:\photo.bmp', ftBlob); При попытке визуализации картинки появилаась ошибка "Bitmap image is not valid"
-
> При попытке визуализации картинки появилаась ошибка "Bitmap > image is not valid"
код попытки?
-
Сохранение в БД Query := TADOQuery.Create(Self);
Query.Connection := frDM.ADOConnection;
i := MaxValueFieldTable(frDM.ADOConnection, 'Workers', 'ID_Worker') + 1;
Query.SQL.Text := 'INSERT INTO Workers ' +
'(ID_Worker, Name_Worker, Adress, Phone, ID_Special, ID_Cvalific, Time_Work, Comment, ' +
'Status_Worker, Status_Record, ModifyComment, YB_Worker, DateCreate, Photo, ID_User) ' +
'VALUES ' +
'(' +
IntToStr(i) + ', ' +
'''' + frWorkersService.edName_Worker.Text + ''',' +
'''' + frWorkersService.edAdress_Worker.Text + ''',' +
'''' + frWorkersService.edPhone_Worker.Text + ''',' +
frWorkersService.edSpecial_Worker.Value + ',' +
frWorkersService.edCvalific_Worker.Value + ',' +
IntToStr(frWorkersService.edYB_Worker.Value) + ',' +
'''' + frWorkersService.edComment_Worker.Text + ''',' +
'0,1,'''',' +
':YB, :Dat, :Ph,' +
frWorkersService.edUser_Worker.Value +
')';
Query.Parameters[0].DataType := ftDate;
Query.Parameters[0].Value := frWorkersService.edHB_Worker.Date;
Query.Parameters[1].DataType := ftDate;
Query.Parameters[1].Value := Date;
Query.Parameters[2].DataType := ftBlob;
Query.Parameters[2].LoadFromFile (frWorkersService.edPhoto_Worker.Hint, ftBlob);
Query.ExecSQL; Визуализация сохраненной картинки frWorkersService.edPhoto_Worker.Picture.Assign(TBlobField(Query.FieldByNam e('Photo'))); В этом месте происходит ошибка "Bitmap image is not valid"
-
В принципе проблема не в визуализации, а в сохранении, потому как даже если я подключаюсь к таблице TADOTable, и к нему цепляю DBImage - при переходе на введенную строку вылезает та - же ошибка... Т. е. видимо это проблема сохранения.
-
Кто нибудь смог сохранить??
-
В Firebird я так делал: (FieldByName('photo') as TBlobField).LoadFromFile(AFileName)
-
var
m: TMemoryStream;
jpg: TJpegImage;
begin
jpg:=TJpegImage.Create;
m:=TMemoryStream.Create;
try
try
jpg.LoadFromFile(OPD.FileName);
jpg.SaveToStream(m);
m.Position:=0;
with Query do
begin
Edit;
(FieldByName('photo') as TBlobField).LoadFromStream(m);
Post;
end;
except
on E:Exception do
raise Exception.Create(...);
end;
finally
jpg.Free;
m.Free;
end;
-- со старого проєкта
-
Сори, недочитал, что надо запросом
-
> zorik © (23.07.08 09:31) [13]
Зачем грузить из файла в стрим, а потом из стрима в BLOBField, если у TBLOBField есть метод LoadFromFile????
-
> Визуализация сохраненной картинки > frWorkersService.edPhoto_Worker.Picture.Assign(TBlobField(Query. > FieldByNam e('Photo')));
var
ms : TMemoryStream;
bmp : TBitmap;
begin
with Query do
begin
if (not Active) or (IsEmty) then Exit;
ms := TMemoryStream.Create;
try
TBLOBField(FieldByName('Photo')).SaveToStream(ms);
ms.Position := 0;
bmp := TBitmap.Create;
try
bmp.LoadFromStream(ms);
edPhoto_Worker.Picture.Assign(bmp);
finally
bmp.Free;
end;
finally
ms.Free;
end;
end;
end;
-
Теперь в самый раз вспомнить, что кроме TImage есть и TDBImage
-
> Теперь в самый раз вспомнить, что кроме TImage есть и TDBImage
Только в случае с bitmap. Стандартный TDBImage, насколько мне не изменяет память, отображает только bitmap
-
> Стандартный TDBImage, насколько мне не изменяет память, > отображает только bitmap
Изменяет. Не только битмап.
-
> Ega23 © (23.07.08 10:51) [19]
На практике, только что проверил, jpeg у меня не отображался. Использую TJvDBImage (JEDI) -- там все ок. Может где-то в свойствах TDBImage.Picture надо формат задавать и тогда все будет ок. Не знаю )))
-
> На практике, только что проверил, jpeg у меня не отображался.
uses JPEG; ?
-
> uses JPEG; ?
Да
"Bitmap Image is not valid"
-
> zorik © (23.07.08 09:31) [13]
Так тут еще вопрос, как различать, что в поле, поле то не OLE А если судить по твоему советуж, то тебе как то все равно это
> zorik © (23.07.08 10:48) [18]
-
Ega23 © (23.07.08 11:03) [21] Причем здесь uses jpeg? нет возможности у стандартного DBImage отображать JPEG.
-
> нет возможности у стандартного DBImage отображать JPEG.
Да? Я просто этой фигнёй не пользовался никогда... А для обычного - достаточно uses jpeg дописать...
-
Поиск по словах DBImage+JPEG дает много ссылок как с этим боротся -- грузить в Image или же использовать сторонние компоненты. Тут проблема в том, что надо предварительно определить что в блобе: битмап грузится в picture.bitmap, a jpeg в picture.graphic
-
zorik © (23.07.08 15:07) [26] Пиши еще тип в другое поле.
-
> stas © (23.07.08 15:24) [27]
Мне уже неактуально это.
Насорили здесь, а автора вопроса уже давно нет
-
> Пиши еще тип в другое поле.
Зачем??? JPEG должен начинаться с $FFD8, bmp - $424D (в bmp, по-моему, в сигнатуре ещё 3-й байт участвует). Стрим у тебя уже есть. Читаешь 2 байта и смотрищь, чему они равны.
-
1. Через таблицу: (table1.fieldbyname('ddd') as TBlobField).loadfromfile('dddss'); Для некоторых баз данных через BDE так можно загрузить не более 64k 2. через параметры в квере... ADOquery1.sql.text:='Insert into myTable (a) Values (:b)';
ADOQuery1.parameters.parseSQL(ADOquery1.sql.text, true);
ADOQuery1.parameters.parambyname('b').LoadFromFile('MyFile');
ADOQuery1.execsql;
-
> Для некоторых баз данных через BDE так можно загрузить не > более 64k
В настройках алиаса параметр BLOB Size для лохов придуман?
-
Ega23 ©, хз, тебе виднее...
-
Стандартный DBImage не умеет работать с jpeg Универсальное свойство - Picture Используйте в Image.Picture.LoadFromFile(), Image.Picture.Assign(), Также LoadFromStream(), CreateBlobStream, SaveToFile
Запрос на сохранение insert into MyTable ( MyPictureField) values ( :ParamPict);
на удаление Update MyTable set MyPictureField = null where ID= КлючНужнойЗаписи;
-
|