[решено] Lazarus + SQLdb не видит BLOB поле

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Keeper
новенький
Сообщения: 22
Зарегистрирован: 05.08.2009 13:11:06
Откуда: Ярославль

[решено] Lazarus + SQLdb не видит BLOB поле

Сообщение Keeper »

Приветствую! Переношу проект с Delphi на Lazarus. Версия Lazarus 0.9.30.2. Использую базу Oracle XE 10g и стандартные компоненты лазаруса для доступа к ней. Нужно считать картинку из BLOB-поля во временный файл. В Delphi я делал это следующим образом:

Код: Выделить всё

Query.SQL.Text := 'select QuestID, Text, Image from ExQuest where QuestID = '
   + GetQuestID(cbQuest.ItemIndex - 1));
Query.Active := True;
TBlobField(Query.FieldByName('Image')).SaveToFile(GetExePath+'temp.jpg')


и всё нормально работало. В лазарусе я получаю сообщение об ошибке:

Query : Field not found : "Image"


Поле в таблице абсолютно точно есть, абсолютно такой-же код в Delphi работает. Что делать, в какую сторону копать?
Последний раз редактировалось Keeper 09.03.2012 13:03:16, всего редактировалось 1 раз.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Может объявить объект TBlobField отдельно, а затем Query.FieldByName('Image').AssignTo
http://docwiki.embarcadero.com/VCL/en/C ... t.AssignTo
Keeper
новенький
Сообщения: 22
Зарегистрирован: 05.08.2009 13:11:06
Откуда: Ярославль

Сообщение Keeper »

Все равно пишет, что поле не найдено. Мистика какая-то.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Может регистр букв имеет значение ?

Или слово image конфликтует с каким нибудь оператором базы данных, хотя маловероятно, но попробуйте переименовать в базе на image_
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

А Вы проверьте, есть такое поле в наборе данных или нет. :) Не в БД, а именно в том наборе данных, который Вы получили:

Код: Выделить всё

For i:=0 To Query.FieldCount-1 Do
  ShowMessage(Query.Fields[i].DisplayName);
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Попробуйте вот так:

Код: Выделить всё

procedure ppp;
const flQuestID = 0; flText = 1; flImage = 2;
begin
  Query.SQL.Text := Format('SELECT QuestID, Text, Image FROM ExQuest WHERE QuestID = %d', [GetQuestID(cbQuest.ItemIndex - 1)]);
  Query.Open;
  TBlobField(Query.Fields[flImage]).SaveToFile(Format('%stemp.jpg', [GetExePath]));
end;

Т.е. обратиться к полю не по имени, а индексу.
Keeper
новенький
Сообщения: 22
Зарегистрирован: 05.08.2009 13:11:06
Откуда: Ярославль

Сообщение Keeper »

Vadim писал(а):А Вы проверьте, есть такое поле в наборе данных или нет. :) Не в БД, а именно в том наборе данных, который Вы получили:

Код: Выделить всё

For i:=0 To Query.FieldCount-1 Do
  ShowMessage(Query.Fields[i].DisplayName);


В наборе данных нужного поля нет. Из-за чего такое может быть?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Keeper писал(а):Из-за чего такое может быть?

Не имею ни малейшего понятия. С Oracle никогда не работал. :)
Алгоритм такой:
1. Какое количество полей получилось после выборки? Если три, как Вы и запрашивали, то выборка прошла нормально.
2. Поскольку поле "Image" у Вас третье по счёту, то нужно узнать, как называется третье поле в Вашем наборе данных:

Код: Выделить всё

ShowMessage(Query.Fields[2].DisplayName);

3. Именно это имя используйте в FieldByName().
Keeper
новенький
Сообщения: 22
Зарегистрирован: 05.08.2009 13:11:06
Откуда: Ярославль

Сообщение Keeper »

Код: Выделить всё

ShowMessage(IntToStr(Query.FieldCount));  

Показывает 2. Значит что-то не так с выборкой.

Добавлено спустя 1 час 31 минуту 6 секунд:
Проблема была в SQLdb компонентах. Перешёл на Zeos и всё заработало. Спасибо всем за помощь!
Ответить