Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
SAN_i
- Сообщения: 14
- Зарегистрирован: 31 июл 2006, 19:24
Сообщение
SAN_i » 16 апр 2008, 01:46
На Delphi7 пишу программу(СУБД). Использую FireBird 1.5.
Есть у меня компонент на форме тип TImage.
Хочу из него фотографию сохрянить в blob поле моей базы данных.
Написал такой код (Stream : TClientBlobStream):
Код: Выделить всё
frmMain.IBClntDtStMain.Locate('ID',CurrentPeopleId,[loCaseInsensitive]);
frmMain.IBClntDtStMain.Edit;
frmMain.IBClntDtStMain.FetchBlobs;
Stream := TClientBlobStream.Create(TBlobField(frmMain.IBClntDtStMain.FieldByName('Photo')),
bmWrite);
Stream.Position := 0;
Stream.Clear;
ImgPeople.Picture.Graphic.SaveToStream(Stream);
frmMain.IBClntDtStMain.Post;
frmMain.IBClntDtStMain.ApplyUpdates(0);
Stream.Free;
Проблема в том что данный код компелируется и никаких ошибок программа при использовании не выдаёт, но изображение в бд так и не появляется.
Подскажите в чем я ошибся, пожалуйста.
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 16 апр 2008, 11:57
Ты его только создал, и дополнительно делаешь Clear и Position... Ну предположим.
А где управление транзакциями?
ApplyUpdates - это ты CDS с Cached Updates используешь что ли?
-
SAN_i
- Сообщения: 14
- Зарегистрирован: 31 июл 2006, 19:24
Сообщение
SAN_i » 16 апр 2008, 16:59
WildSery писал(а):Ты его только создал, и дополнительно делаешь Clear и Position... Ну предположим.
А где управление транзакциями?
ApplyUpdates - это ты CDS с Cached Updates используешь что ли?
Cached Updates - не используется, просто гдето в нэте вычитал что при работе с blob полями просто выполнить Post мало, что нужно ещё и ApplyUpdates.
Насчёт Clear и Position... да наверное погорячился, попробывал без них и без ApplyUpdates, ситуация не изменилась.
О транзакциях както не подумал, попробую поковырять в этом направлении.
Спасибо за ответ.
-
SAN_i
- Сообщения: 14
- Зарегистрирован: 31 июл 2006, 19:24
Сообщение
SAN_i » 09 май 2008, 00:35
WildSery писал(а):Так, на всякий случай.
Вот тут читал?
Прочитал. Полезно, спасибо за ссылку но мне не помогло
.
Попробовал написать код наподобии того, что указан в примере, так тоже самое код выполняется без возникновения ошибок но когда смотрю данные через ibexpert поле попрежнему null.
Вот используемый мной код:
Код: Выделить всё
if OpnPctrDlgPhoto.Execute then
begin
frmMain.IBDataSet1.Open;
frmMain.IBDataSet1.Edit;
(frmMain.IBDataSet1.FieldByName('Photo') as TBlobField).LoadFromFile(OpnPctrDlgPhoto.FileName);
frmMain.IBDataSet1.Post;
end;
В ModifySQL использовал такой запрос:
Код: Выделить всё
update PEOPLE
set
PEOPLE.PHOTO = :PHOTO
where
PEOPLE.ID_PEOPLE = :OLD_ID
Транзакция(хоть это и не правильно) открывается автоматически.
Тип blob поля 0.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 09 май 2008, 01:18
1. не верю.
2. commit делал?
3. после рестарта всего блоб так и не видно?
я удивляюсь, как люди умудряются писать кривой код при таких простых действиях, тем более описанных в FAQ
www.ibase.ru/devinfo/ibx.htm#blob
www.ibase.ru/ibfaq.htm#blob
еще замечу, что в faq и ibx.htm помещен 100% работающий код, который был специально проверен, перед тем как публиковать эти ответы на вопросы.
-
SAN_i
- Сообщения: 14
- Зарегистрирован: 31 июл 2006, 19:24
Сообщение
SAN_i » 09 май 2008, 01:30
Код: Выделить всё
if OpnPctrDlgPhoto.Execute then
begin
if not frmMain.IBDataSet1.Transaction.Active then
frmMain.IBDataSet1.Transaction.StartTransaction;
frmMain.IBDataSet1.Open;
frmMain.IBDataSet1.Edit;
(frmMain.IBDataSet1.FieldByName('Photo') as
TBlobField).LoadFromFile(OpnPctrDlgPhoto.FileName);
frmMain.IBDataSet1.Post;
frmMain.IBDataSet1.Transaction.Commit;
end;
Вот так я пробовал с commit. Результат прежний. Как то умудрился написать, вот только не пойму как, а хотелось бык...
-
SAN_i
- Сообщения: 14
- Зарегистрирован: 31 июл 2006, 19:24
Сообщение
SAN_i » 09 май 2008, 01:44
Толькочто походу разобрался, проблема вроде с указанием ключа таблицы. В ближайшее время розберусь и выложу рабочий вариант.
Спасибо WildSery и kdv за помощ.
ЗЫ: всётаки
http://www.ibase.ru/devinfo/ibx.htm#blob помогло.
-
SAN_i
- Сообщения: 14
- Зарегистрирован: 31 июл 2006, 19:24
Сообщение
SAN_i » 12 май 2008, 19:32
Вобщем так у меня работает:
Код: Выделить всё
if OpnPctrDlgPhoto.Execute then begin
if not frmMain.IBDataSet1.Transaction.Active then
frmMain.IBDataSet1.Transaction.StartTransaction;
ImgPeople.Picture.LoadFromFile(OpnPctrDlgPhoto.FileName);
frmMain.IBDataSet1.Open;
frmMain.IBDataSet1.First;
while frmMain.IBDataSet1.FieldByName('ID').AsInteger <> CurrentPeopleId do
frmMain.IBDataSet1.Next;
frmMain.IBDataSet1.Edit;
(frmMain.IBDataSet1.FieldByName('Photo') as TBlobField).LoadFromFile(OpnPctrDlgPhoto.FileName);
frmMain.IBDataSet1.Post;
frmMain.IBDataSet1.Transaction.Commit;
if not frmMain.IBDataSet1.Transaction.Active then
frmMain.IBDataSet1.Transaction.StartTransaction;
frmMain.DataUpd;
end;