dsBrowse i cannot perform this operation on a closed...

0

Jak zwykle, po trzech dniach rwania sobie włosów z głowy, udaję się po pomoc do Forumowiczów.
Dataset (proste select * from z parametrem) jest w trybie dsBrowse (widzę w debuggerze i tak wynika z instrukcji). Wykonanie instrukcji

Dataset.active:=false

powoduje pojawienie się znienawidzonego przeze mnie od kilku dni błędu:
cannot perform this operation on a closed dataset
Poprzedzenie tej instrukcji instrukcją dataset.open nic nie zmienia!
Podobnie, gdy wprowadzę dataset w stan dsEdit, komunikat ten sam.

Sekwencja instrukcji (nie jest konieczna w mojej procedurze, ale wpisana w trakcie poszukiwań rozwiązania)

if dataset.state<>dsInactive then
 dataset.close
dataset.open

powoduje, ze gdy dataset jest w stanie dsEdit, to dataset.close też generuje ten kopany, wspomniany wyżej błąd.

Nie mam już pomysłów!!!

0

może napisz co chcesz zrobić i jakich komponentów połączeniowych używasz

0

Używam ADO.

Sekwencja operacji:
mam ekran z listą obiektów, po wyborze obiektu z grida, przez dwukrotnie kliknięcie przechodzi się na ekran modyfikacji szczegółów i na tym ekranie jest ten nieszczęsny dataset, którego parametrem jest id wybranego z listy obiektu.
dataset.active:=false wykonuję przed ustawieniem paratertu w FormShow, tj:

dsppom.Active:=false;
with dsppom.Parameters do
      begin
        ParamValues['pid']:= Form3.qryLista.FieldByName('id_programu').AsInteger
      end;
dsPpom.Active:=true;

Pad następuje na 1-szej zacytowanej linii.

Co więcej, gdy po raz pierwszy wybieram element do edycji z listy, wszystko jest OK, gdy wracam z ekranu modyfikacji do listy i wybieram inny (bąź ten sam) element, otrzymuję komunikat o błędzie!

0
  1. Sprawdź czy masz podłączone i aktywne ADOConnection
  2. Lepiej użyć DBGrid -> DataSource -> ADOQuery / ADOStoredProc -> ADOConnection
0

Dziekuję za odpowiedź.

ADOCOnnection jest aktywne. Jest jedno na całą aplikację, otwieram je raz i więcej nie dotykam.

Chodzi o to, że lepiej użyć ADO Querty niż datasource'a? Przy ADOQuery nie będę mogła wprowadzać zmian do tabel.

0

Zasaadniczo ADO składa się z 4 bloków:

  1. Połaczenie - ADOConnection
  2. Interpretator: TDataSet, ADOQuery, ADOStoreProc
  3. Element przechowujący dane: DataSource
    4: Element wyświetlający: DBxxx np DBGrid, DBEdit

Polecam coś takiego:

ADOQuery1.Parameters.ParamByName('id').Value := 37;
ADOQuery1.Open;
0

a jaka wersja delphi bo podobny błąd był w delphi 5 i byl do tego patch chyba

0

Może typ parametru nie jest ustawiony? Chyba miałem taki problem wtedy.

0
gamestone napisał(a)

Zasaadniczo ADO składa się z 4 bloków:

  1. Połaczenie - ADOConnection
  2. Interpretator: TDataSet, ADOQuery, ADOStoreProc
  3. Element przechowujący dane: DataSource
    4: Element wyświetlający: DBxxx np DBGrid, DBEdit

Polecam coś takiego:

ADOQuery1.Parameters.ParamByName('id').Value := 37;
ADOQuery1.Open;

Wszystko jest!

puchi napisał(a)

a jaka wersja delphi bo podobny błąd był w delphi 5 i byl do tego patch chyba

Delphi 2009

rasert napisał(a)

Może typ parametru nie jest ustawiony? Chyba miałem taki problem wtedy.

Typ jest ustawiony!

[glowa]

Zdaje się, że się udało. Idąc za radą gamestone'a zrezygnowałam z wykonywania

dataset.active:=false;

tylko po zmianie parametru otworzyłam dataset.
Klient wypunktował mi ten błąd na samym początku listy błędów, więc sprawa stała się paląca, ale teraz może będzie dobrze.
Pozostaje pytanie, dlaczego ten błąd pojawia się, gdy stan dataseta jest Browse lub Edit!

Serdecznie dziękuję wszystkim. Zawsze mnie zadziwiają uczestnicy tego forum!

0

Czuję, że zaciągnęłam dług. Więc się zarejestrowałam i też spróbuję pomagać. :-)

0

Czasem jest tak że miejsce rozpoczęcia transakcji "explicite" zależy od pojawiania się różnych dziwnych błędów tego typu. Niektóre komponenty domyślnie otwierają i zamykają transakcje i wtedy nie wiemy gdzie ona dokładnie startuje. Ja już teraz dokładnie podaję początek i koniec transakcji osobnym kodem i zniknęło mi większość problemów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1