Особенности работы с БД в 0.9.28

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

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

Ответить
Владимир
постоялец
Сообщения: 361
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Особенности работы с БД в 0.9.28

Сообщение Владимир »

Всем доброго!
Использую MySQL
Хочу обратить внимание на чтение записей из БД с использованием SQLdb.
Вольности кончились!
Это теперь не работает!

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

CmboBox1.Items.Clear;
select name from table_nm;//name-char
 with SQLQuery do begin
 First;
  while not EOF do begin
 ComboBox1.Items.Add(FieldByName('name').Value);
 Next;
 end;//while
end;//with

Аналогично - тоже не работает

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

select number from table_nm;//number-int
with SQLQuery do begin
 First;
 while not EOF do begin
  case FieldByName('number').Value of
 0:  ....
 1:  ....
  end;//case
 Next;
 end;//while
end;//with


Теперь следует аккуратно читать ответ в переменную, соответствующую типу поля, а уж потом делать присваивание.
Т.е. в первом примере

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

var
s:String;
....
CmboBox1.Items.Clear;
select name from table_nm;//name-char
with SQLQuery do begin
 First;
 while not EOF do begin
 s:=FieldByName('name').Value
 CmboBox1.Items.Add(s);
 Next;
 end;//while
end;//with

и соответственно во втором

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

var
i:Integer;
....
select number from table_nm;//number-int
with SQLQuery do begin
 First;
 while not EOF do begin
 i:=FieldByName('number').Value;
  case i of
  0:  ....
  1:  ....
  end;//case
 Next;
 end;//while
end;//with
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Не работает на этапе компиляции или в ран-тайме?
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

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

FieldByName('name').Value 

С Value всегда была неразбериха в разных версиях fpc/Lazarus. Попробуйте

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

ComboBox1.Items.Add(FieldByName('name').AsString); 

Ну и для остальных данных соответственно AsInteger, AsFloat....
Владимир
постоялец
Сообщения: 361
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

GAMER писал(а):Не работает на этапе компиляции или в ран-тайме?

К компиляции это отношения не имеет - ошибки нет. Дело в том, что FieldByName().Value изначально имеет тип Variant, т.е. может быть ЛЮБЫМ типом, а разработчик, зная тип поля, присваивает ему переменную с правильным типом. Компилятор об этом не знает. В run-time ошибки также не возникает, просто значение запрашиваемого поля оказывается пустым.

Добавлено спустя 12 минут 46 секунд:
Logo писал(а):

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

FieldByName('name').Value 

С Value всегда была неразбериха в разных версиях fpc/Lazarus. Попробуйте

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

ComboBox1.Items.Add(FieldByName('name').AsString); 

Ну и для остальных данных соответственно AsInteger, AsFloat....

Понятно, спасибо. Я думаю, что персональное присваивание ожидаемому типу должно работать всегда!
Надеюсь...
Ответить