Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

При компиляции приложения закрываются все IBDataSet?   Найти похожие ветки 

 
miwa ©   (2004-05-06 03:28) [0]

В дизайн-тайм я вижу свои запросы (Grid.DataSource.DataSet.Active = true), а как только запускаю программу - все гриды девственно чисты (Grid.DataSource.DataSet.Active := true). Использую IBX+EhLib. Это какие-то общие грабли, или я свои собственные изобрел?
Да. В FormCreate специально закомментировал процедуры, которые проводят загрузку данных - все равно после компиляции все гриды пустые.


 
Johnmen ©   (2004-05-06 09:01) [1]

>или я свои собственные изобрел?

Ага. Это они, Active = true в дизайн-тайм


 
miwa ©   (2004-05-06 09:03) [2]

А что такого? Я подсоединил датасеты в дизайнтайме только чтобы убедится что у меня есть коннект с базой. А активны они или нет - на результат это не влияет. Результат нехороший. :о((


 
Johnmen ©   (2004-05-06 09:13) [3]

>А что такого?
>Я подсоединил датасеты в дизайнтайме только чтобы убедится ...

Убедился - отсоедини. В смысле, закрой.
Коннект и оупен в ран-тайме.


 
miwa ©   (2004-05-06 09:28) [4]

Так и делаю. Все равно все датасеты пустые.


 
Соловьев ©   (2004-05-06 09:34) [5]


> Да. В FormCreate специально закомментировал процедуры, которые
> проводят загрузку данных - все равно после компиляции все
> гриды пустые.

Интересно какие? Может ты транзакции закрыл?


 
Miwa ©   (2004-05-06 10:36) [6]

Не закрывал я транзакций. Тоесть, не так.
Как при закоментированных строках загрузки базы данных так и при разкоментированных; как при установленных active=true в дизайнтайме так и при неустановленных результат один и тот же:
в дизайнайм я могу видеть данные, которые получают соответствующие датасеты, а в рантайм - нет.
Какой код приводить? (в том смысле, что если надо код я приведу, весь и сразу не привожу из-за немаленьких размеров последнего).


 
Соловьев ©   (2004-05-06 10:41) [7]


> Miwa ©   (06.05.04 10:36) [6]

создай новое приложение кинь туда джентельменский набор: датабейс, транзакцию и датасет и попробуй открыть одну таблицу. и запусти. если все ок - то смотри что ты там мадурил(телепатов нет и сказали что не будет их больше), если не появятся - может патч поможет. брать на www.ibase.ru


 
Tomkat   (2004-05-06 11:29) [8]

Вот тебе пример:
есть форма, на ней IBDatabase, IBTransaction, IBDataSet, TDataSource, TGrid.
В дизай-тайме IBDataSet.Active:=false;
В ран-тайме   по собтию MyForm.OnShow

                         Begin
                             ibDataSet.Open;
                          End

             по собтию MyForm.OnClose
     
                         Begin
                             ibDataSet.close;
                          End ;

Я так всегда творю и проблем никаких ...
если я правильнопонял твою проблему ..


 
Кщд ©   (2004-05-06 14:02) [9]

Tomkat   (06.05.04 11:29) [8]
каждый раз при Visible=true открывать набор - не есть хорошо в общем случае, имхо.


 
Кщд ©   (2004-05-06 14:03) [10]

Tomkat   (06.05.04 11:29) [8]
каждый раз при Visible=true открывать набор - не есть хорошо в общем случае, имхо.


 
Карелин Артем ©   (2004-05-06 14:05) [11]

Может пользуешься персональным яфелем или внедренным FB?


 
Miwa ©   (2004-05-06 17:43) [12]

> Tomkat   (06.05.04 11:29) [8]
Нет, проблема несколько в ином.

>Карелин Артем ©   (06.05.04 14:05) [11]
Тестирую на Interbase 5.5 на работи и Firebird 1.03 дома. В обеих случаях тот же баг.

Наверное, прав Соловьев - надо 25-й раз код шерстить. Если ничего не накопаю, опять приду жаловаться ;о))


 
Miwa ©   (2004-05-06 21:03) [13]

Нет, ничего таки не нашерстил. Так что все же прошу еще раз помощи. Код для FormCreate спрощенно выглядит так:
procedure TfrmMain.FormCreate(Sender: TObject);
var err:integer;
begin
 PathProg:=ExtractFilePath(Application.ExeName);
 LoadSettings(PathProg+"mividex.ini");
 LoadLanguage(lang);
 LoadSkin(skin);//skin - это глобальная переменная
 LoadDBFilms(FilmsDB);//так же как и остальные
 LoadDBFiles(FilesDB);//FilesDB="правильный путь к базе"

 for err:=0 to frmMain.ComponentCount-1 do
   if (Components[err].ClassName = "TDBGridEh")
     then (Components[err] as TDBGridEh).RestoreColumnsLayoutIni(PathProg+"MiVidEx.ini",(Components[err] as TDBGridEh).Name,[crpColWidthsEh]);

 LoadPathes(clbPathes);
 wbbFilms.Navigate("about:blank");
end;


Собственно LoadDBFiles, если спростить, то такая:

function LoadDBFiles(DataBase:string):integer;
var i:integer;
   err: Exception;
begin
 try
   CheckDB(dtmData.ibdFiles, DataBase);
   for i:=0 to dtmData.ibdFiles.DataSetCount-1 do
   try
     if dtmData.ibdFiles.DataSets[i].ClassType = TIBDataSet
       then  dtmData.ibdFiles.DataSets[i].Active:=true;
   except
   end;
   //дальше несущественно
 except
   on err:exception do begin
     result:=-1;
     showmessage(err.Message);
   end;
 end;
end;


Ну и выделенная процедурка:
procedure CheckDB(DataBase:TIBDataBase;path:string);
begin
 with DataBase do begin
   Connected:=false;
   DatabaseName:=path;
   Params.Clear;
   Params.Add("user_name=MIVIDEX");
   Params.Add("password=mividex");
   Params.Add("lc_ctype=WIN1251");
   Open;
   DefaultTransaction.Active:=true;
 end;//with
end;

Вот...
А теперь еще раз вопросс: почему вышенаведенный код не призводит к загрузке базы?


 
Miwa ©   (2004-05-11 13:20) [14]

Мда.
В горы съездил, отдохнул, вроде, а даже со свежей головой ничего придумать не могу. Помогите нерадивому :о((.


 
Fay ©   (2004-05-11 13:57) [15]

А в dt и rt на одну и ту же базу смотрим?


 
miwa ©   (2004-05-11 14:21) [16]

Только что проверял. Да. Правда, в DT она была прописана, как .\files.gdb а в RT - полное имя(получаю с ини-файла). Поменял (теперь всюду - полное имя, еще раз повторюсь - правильное), но ничего не помогло.


 
Плохиш   (2004-05-11 14:28) [17]

>Miwa ©   (06.05.04 21:03) [13]

А Вы вообще знаете для чего в Delphi кнопки F7/F8 существуют?


 
miwa ©   (2004-05-11 14:33) [18]

Как ни странно ;о)).
Более того, я по Ф7 пробежался по всему коду загрузки программы. И она, сосиска разтакая, ни разу нигде не ругнулась. Все всюду хорошо, да только данных в гридах как не было, так и нет.


 
Плохиш   (2004-05-11 14:37) [19]

>miwa ©   (11.05.04 14:33) [18]

тогда одно из двух, или наборы данных пустые, или код открытия их не выполняется.


 
miwa ©   (2004-05-11 14:44) [20]

Минут пять назад запустил следующий код:
with dtmData.IBQuery1 do begin
 SQL.Add("SELECT * FROM files");
 Open;
 s:="";
 while not eof do begin
   s:=s + Fields[0].AsString;
 end;
 showmessage(s);
end;

Жду. Выполняется. В таблице files до сотни записей.
Нет, код так и не зпустился. Скомпилировал приложение, запустил напрямую (не из Дельфи) - заняло 98% рессурсов и все.
Копаю дальше. Не подскажете, куда?
Кстати, могла ли проблема вылезти при смене юзера (с SYSDBA на MIVIDEX)? При том, что в DT и IBExpert та же смена прошла безболезненно.


 
Соловьев ©   (2004-05-11 14:47) [21]


> with dtmData.IBQuery1 do begin
>  SQL.Add("SELECT * FROM files");
>  Open

SQL.Clear;


> Все всюду хорошо, да только данных в гридах как не было,
> так и нет.

Так на всякий случай - а гриді подключены к сорсам?

И еще - делал как я говорил? новый проект?


> (с SYSDBA на MIVIDEX)?

а как это? вроде этого нельзя сделать никак :)


 
Miwa ©   (2004-05-11 14:59) [22]

> 20
Конечно, там я пропустил Next;. С "некстом" все ОК.

Тоесть, я вижу ети чертовы данные. Блин.

>21
>SQL.Clear;
Знаю. Это тестовый запрос.

>Так на всякий случай - а гриді подключены к сорсам?
Да. В дизайн-тайме же все видно.

>И еще - делал как я говорил? новый проект?
Да. В новом проекте - все в порядке.

>а как это? вроде этого нельзя сделать никак :)
Не, ну почему же :о))
Сперва добавил нового юзера на сервере, потом поменял параметры

соединения (username=sysdba на username=mividex).

Программа работает с двумя базами и с "files" я думал, что все

закончил. Поетому, добившись исполнения нужных мне функций я не

смотрел на нее уже с месяц. А когда посмотрел... Вот...


 
Соловьев ©   (2004-05-11 15:04) [23]


> Сперва добавил нового юзера на сервере, потом поменял параметры

аа... ты про это :)


 
Соловьев ©   (2004-05-11 15:15) [24]


> Сперва добавил нового юзера на сервере, потом поменял параметры
>
>
> соединения (username=sysdba на username=mividex).

а правда ты дал ему? и еще в дизайне SYSDBA?


 
Соловьев ©   (2004-05-11 15:17) [25]


> а правда

:) - права


 
miwa ©   (2004-05-11 15:19) [26]

Ага.
Копаю дальше.
В тестовом запросе SQL сделал такой же, как в одном из неработающих датасетов.
И данные вижу, блин! Тоесть, вроде бы проблемма в том, что не открываются сами датасеты в следующих строках (13-й ответ)
  for i:=0 to dtmData.ibdFiles.DataSetCount-1 do
  try
    if dtmData.ibdFiles.DataSets[i].ClassType = TIBDataSet
      then  dtmData.ibdFiles.DataSets[i].Active:=true;
  except
  end;

Но почему?
Поменял приведенный фрагмент на такой:

   for i:=0 to dtmData.ibdFiles.DataSetCount-1 do
     if dtmData.ibdFiles.DataSets[i].ClassType = TIBDataSet then
       try
         dtmData.ibdFiles.DataSets[i].Open;
       except
         on err: exception do showmessage(err.message);
       end;

И НИ ОДНОГО СООБЩЕНИЯ!
Тоесть, датасеты открываются?!?!
Иду вешаться.


 
miwa ©   (2004-05-11 15:20) [27]

Ага.
Копаю дальше.
В тестовом запросе SQL сделал такой же, как в одном из неработающих датасетов.
И данные вижу, блин! Тоесть, вроде бы проблемма в том, что не открываются сами датасеты в следующих строках (13-й ответ)
  for i:=0 to dtmData.ibdFiles.DataSetCount-1 do
  try
    if dtmData.ibdFiles.DataSets[i].ClassType = TIBDataSet
      then  dtmData.ibdFiles.DataSets[i].Active:=true;
  except
  end;

Но почему?
Поменял приведенный фрагмент на такой:

   for i:=0 to dtmData.ibdFiles.DataSetCount-1 do
     if dtmData.ibdFiles.DataSets[i].ClassType = TIBDataSet then
       try
         dtmData.ibdFiles.DataSets[i].Open;
       except
         on err: exception do showmessage(err.message);
       end;

И НИ ОДНОГО СООБЩЕНИЯ!
Тоесть, датасеты открываются?!?!
Иду вешаться.


 
Плохиш   (2004-05-11 15:27) [28]

>miwa ©   (11.05.04 15:20) [27]

Осталось только строчку

>      if dtmData.ibdFiles.DataSets[i].ClassType = TIBDataSet then

Заменить на

    if dtmData.ibdFiles.DataSets[i] is TIBDataSet then

или выкинуть, для проверки, совсем.


 
Плохиш   (2004-05-11 15:28) [29]


> И НИ ОДНОГО СООБЩЕНИЯ!
> Тоесть, датасеты открываются?!?!

или код не выполняется, не забываем.


 
miwa ©   (2004-05-11 15:31) [30]

>25
Конечно что дал.
Говорю - в ИБЭксперте, дизайнтайме и рантайме все одинаково, да только в рантайме нифига не видно.
Может, это ЭхЛиб глючит? Никто ни с чем похожим не встречался?

>модератор
27-й пост - результат ошибки. Тоесть, у меня загрузилась "Internal server error" и я нажал "<--", "Добавить".


 
miwa ©   (2004-05-11 15:41) [31]

>28
>Заменить на if dtmData.ibdFiles.DataSets[i] is TIBDataSet then
[Error] shared.pas(314): Operator not applicable to this operand type

> выкинуть, для проверки, совсем.
Получил только "Empty SQL statement" для четырех IBQuery, которые заполняются позже.

>или код не выполняется, не забываем.
Тоесть, по F7 выполняется, а по F9 - нет? По F7, кстати, тоже ничего не ругается, но и данных не видно.
Кстати, в 13 я привел фрагменты кода, которые грузят данные. Все они обрамлены try-except-тами, в которых есть showmessage(err.message) или result:=-1. Но ни один из них не срабатывает. Так что код, наверное, выполняется.


 
div ©   (2004-05-11 15:54) [32]

был у меня однажды такой прикол - в Database случайно поставил значение свойства IdleTimer в 10... в дизайне все есть, запускаю - все пусто... долго же я боролся... посмотри может и тебя такая же "беда" )))


 
miwa ©   (2004-05-11 16:06) [33]

Нет, я, наверное, другое свойство поменял ;о)). Вообще-то они у меня дефолтные кроме имени, транзакции и имены БД. А. Еще loginprompt=false, по-дефолту, вроде, нет. :о)).


 
div ©   (2004-05-11 16:15) [34]

заинтересовал меня следующий код:

for err:=0 to frmMain.ComponentCount-1 do
  if (Components[err].ClassName = "TDBGridEh")
    then (Components[err] as TDBGridEh).RestoreColumnsLayoutIni(PathProg+"MiVidEx.ini",(Components[err] as TDBGridEh).Name,[crpColWidthsEh]);

открой свою ini-шку и сотри все сохраненные настройки гридов...


 
Miwa ©   (2004-05-11 18:21) [35]

>34
>открой свою ini-шку и сотри все сохраненные настройки гридов.
Нет, не прошло :о((.


 
div ©   (2004-05-11 18:42) [36]

очень похоже что код:

for i:=0 to dtmData.ibdFiles.DataSetCount-1 do
    if dtmData.ibdFiles.DataSets[i].ClassType = TIBDataSet then
      try
        dtmData.ibdFiles.DataSets[i].Open;
      except
        on err: exception do showmessage(err.message);
      end;

выполняется ДО того как происходит внутреннее связывание DataSet"ов с DataBase. Попробуй поставить в опциях проекта свой дата-модуль (dtmData) ДО главной формы (frmMain)...


 
miwa ©   (2004-05-11 18:54) [37]

>div ©   (11.05.04 18:42) [36]
Я очень благодарен за проявленное внимание, но все же... Вот отрывок из .dpr файла:

 Application.CreateForm(TdtmData, dtmData);
 Application.CreateForm(TfrmMain, frmMain);

Это наверное, то же, что и поставить в опциях проекта свой дата-модуль (dtmData) ДО главной формы (frmMain).
Вопросс открыт.


 
Miwa ©   (2004-05-12 09:37) [38]

Все еще ничего не накопал.


 
div ©   (2004-05-12 09:53) [39]

попробуй
if dtmData.ibdFiles.DataSets[i].ClassType = TIBDataSet then ...
заменить на:
if dtmData.ibdFiles.DataSets[i] is TIBDataSet then ...


 
div ©   (2004-05-12 09:56) [40]

или вообще убери эту проверку - она лишняя...



Страницы: 1 2 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.047 c
4-1083766292
Maximys
2004-05-05 18:11
2004.06.06
Поиск в реестре


14-1084971676
AlexG
2004-05-19 17:01
2004.06.06
Как создать сервер в MSSQL?


14-1085075926
sergey
2004-05-20 21:58
2004.06.06
записать ДВД на CD-RW


14-1085057257
Lessa
2004-05-20 16:47
2004.06.06
Извечная проблема трея и таскбара


4-1082111100
sapsi
2004-04-16 14:25
2004.06.06
Получение хэндлов окон Word и Exсel