Глюк Delphi. Может кто сталкивался?

maravan
Дата: 26.11.2007 01:00:08
Уважаемые участники форума!
Пишу приложения на Delphi 7.0 уже более 4 лет с применением ADO.
Но только сейчас заметил глюк (и в CodeGear тоже).

Описание глюка: Кладу на форму кнопку (TButton), датасет (TAdoDataSet), коннекшн (TAdoConnection).
Заполняю датасет полями (2 раза мышкой по нему -> add all fields), пишу в обработчик кнопки:

var
  test: integer;
begin
  test:= ADODataSet1.FieldByName('id').AsInteger;
  ShowMessage(IntToStr(test));
end;

Датасет - закрыт (Active=false), коннекшн открыт (Connected=true).

Компилирую, нажимаю на кнопку, получаю access violation (модуль DB, метод Resync, строка 9872).
Еще раз нажимаю на кнопку, получаю.... нет, не access violation, а вывод на экран '0'. Хотя теоретически я сначала должен был получит второй результат. Или я не прав. Может кто сталкивался с такой же проблемой. И как ее кто решал???

Спасибо!
Di_LIne
Дата: 26.11.2007 01:20:12
Глюк - за клавиатурой.
Логику действий, с открытием ДатаСет-а, проанализируй...
maravan
Дата: 29.11.2007 01:00:01
2 Di_LIne: Дай лучше конкретное замечание или предложение, и без наездов!

А что именно анализировать, если я ничего не открываю?=)
ADODataSet1.FieldByName('id').AsInteger
- датасет не открыт, а access violation выдает, причем только один раз!
Т.е. еще раз опишу: Датасет не открываем, ставим точку после "begin", нажимаем на кнопку, падаем в точку, смотрим в отладчик,
ADODataSet1.FieldByName('id').AsInteger 
- access violation 000... Далее не нажимая F8 и т.д, еще раз идем в отладчик, вбиваем туда
ADODataSet1.FieldByName('id').AsInteger
, а там уже "0". И после этого я глюк?
Gerasimenko
Дата: 29.11.2007 10:14:41
var
  test: integer;
begin
 if (ADODataSet1.Active=True) and (ADODataSet1.RecordCount>0)
  then begin //000
     test:= ADODataSet1.FieldByName('id').AsInteger;
     ShowMessage(IntToStr(test));
         end;//000
end;
maravan
Дата: 29.11.2007 12:32:24
2 Gerasimenko: на самом деле так и выходил из ситуации (только проверял по ADODataSet1.isEmpty). Но это лишний код=(
tdhfghfgh
Дата: 29.11.2007 12:56:01
База access?
maravan
Дата: 29.11.2007 13:05:26
2 tdhfghfgh: Нет MS SQL 2005!
Anatoly Podgoretsky
Дата: 29.11.2007 13:10:41
Тебе не кажется странным работать с закрытым датасет? Сначала открой его.
А во второй раз ты получаешь свой 0 поскольку датасет уже открылся автоматически.
maravan
Дата: 29.11.2007 13:31:10
2 Anatoly Podgoretsky: Нет не кажется, чего тут странного. Эти ситуации должен на себя Delphi брать. А то получается я должен это помнить, что такого делать нельзя=). Не логично. А кстати, кто тебе сказал, что датасет открывается... Он не открывается, профайлером проверял...
Anatoly Podgoretsky
Дата: 29.11.2007 13:37:34
Трудно что либо точно сказать по приведеному огрызку, но обращение ADODataSet1.FieldByName('id').AsInteger; при закрытом наборе явно не допустимо. Довавь строчку перед test :=, ADODataSet1.Open и сообщи результат.