RecordCount zawiesza program

0

Witam, pisze sobie program i nagle przestał sie uruchamiać, a dokładnie to zawiesza się podczas odpalania.

Wyśledziłem ze aplikacja zawiesza sie na poleceniu:

ile:=ddm.kSQLDataSet.RecordCount;

zwis jest kompletny, program po prostu zamiera, debuger nic nie pokazuje, nie ma błędu nie ma nic, a program wisi.

Co sie dzieje?

0

A może trochę więcej kodu...?

0

cała procedura:

procedure Tfglowne.zczytajbaze_kier2;
var
  pom,dl,ijr:integer;
  pasek:tfpostep;
begin

  pasek:=tfpostep.Create(self);
  pasek.ust_dltxt(2,'krok1');
  pasek.Show;
  try
  ddm.kSQLdata.CommandText:='SELECT * FROM kierowcy ORDER BY nowy DESC, idkier;';
  ddm.kSQLdata.Active:=true;
  pasek.step(-1);
  except
    showmessage('Błąd 1');
  end;
  pasek.Hide;
  pasek.Free;

  try
  ddm.konekszyn.Open;
    try
      dl:=1;
      pom:=0;
      pasek:=Tfpostep.Create(self);
      ijr:=ddm.kSQLdata.RecordCount;
      pasek.ust_dltxt(ijr,'(kierowcy)');
      pasek.Show;
      while not ddm.kSQLdata.Eof do
        begin
        setlength(tabkier,dl);
        tabkier[pom].idkier:=ddm.kSQLdata.FieldValues['idkier'];
        tabkier[pom].imie:=ddm.kSQLdata.FieldValues['imie'];
        tabkier[pom].nick:=ddm.kSQLdata.FieldValues['nick'];
        tabkier[pom].haslo:=ddm.kSQLdata.FieldValues['haslo'];
        try
          tabkier[pom].klan:=ddm.kSQLdata.FieldValues['klan'];
        except
          on EVariantTypeCastError do tabkier[pom].klan:='';
        end;
        tabkier[pom].gg:=ddm.kSQLdata.FieldValues['gg'];
        tabkier[pom].mail:=ddm.kSQLdata.FieldValues['mail'];
        tabkier[pom].nowy:=ddm.kSQLdata.FieldValues['nowy'];
        tabkier[pom].admin:=ddm.kSQLdata.FieldValues['admin'];
        tabkier[pom].etat:=ddm.kSQLdata.FieldValues['etat'];

        inc(pom);
        inc(dl);
        ddm.kSQLdata.Next;
        pasek.step(-1);
        end;
      pasek.Hide;
      pasek.Free;
    except
      showmessage('Błąd (kier)');
    end;
  finally
    ddm.konekszyn.Close;
  end;

end;
0

Po 1. Po co zwalniasz pasek postępu, jak za chwilę go i tak tworzysz?
Po 2. Nie używaj CommandText, tylko SQL do takich zapytań.
Po 3. Czy konekszyn nie powinno być otwarte wcześniej? W ogóle konekszyn powinno się otwierać raz w programie. Chyba, że SZBD na to nie pozwala(traci połączenie) albo coś.
Nie wiemy tak naprawdę czym jest kSQLData i do jakiej bazy używasz.
Spróbuj przed RecordCount dać FetchAll.

0
Juhas napisał(a)

Po 1. Po co zwalniasz pasek postępu, jak za chwilę go i tak tworzysz?

w sumie to nie wiem :P poprawie.

Juhas napisał(a)

Po 2. Nie używaj CommandText, tylko SQL do takich zapytań.

ale jak? ddm.kSQLdata.sql ? nie ma takiego czegos.

Juhas napisał(a)

Po 3. Czy konekszyn nie powinno być otwarte wcześniej? W ogóle konekszyn powinno się otwierać raz w programie. Chyba, że SZBD na to nie pozwala(traci połączenie) albo coś.

Jesli otworze raz i po właczeniu programu zostawie go np na 4-5 minut idle, to jak uruchomie jakies odwołanie do bazy to dostaje "mysql server has gone away".

Juhas napisał(a)

Nie wiemy tak naprawdę czym jest kSQLData i do jakiej bazy używasz.
Spróbuj przed RecordCount dać FetchAll.

są to komponenty Dbexpress

0

Nadal nie wiemy czym jest kSQLData.
Poza tym, najpierw próbujesz wykonać zapytanie, a dopiero potem otwierasz połączenie :|

0
Juhas napisał(a)

Nadal nie wiemy czym jest kSQLData.

to komponent TSQLDataSet z zakładki dbExpress

Juhas napisał(a)

Poza tym, najpierw próbujesz wykonać zapytanie, a dopiero potem otwierasz połączenie :|

tak do konca nie wiem po co jest to open i close, z bazą się łącze przy tworzeniu/niszczeniu DataModule. Jak wywale konekszyn.open i close całkiem to czesto nie chce pobrać danych twierdząc że hasło do bazy jest nieprawidłowe :| Jak jest w takiej postaci jak teraz, to działa (pomijając zawieszanie się na recordcount)

0

Nie wiem, co mam Ci powiedzieć.
Coś tu kręcisz. Najpierw mówisz, że jak pozostawisz połączenie z bazą na trochę dłużej, to Ci się automatycznie zamyka(też tak miałem przy MySQL).
Potem mówisz, że otwierasz połączenie tylko raz.

To ile Ty masz połączeń do jednej bazy otwartych jednocześnie?

0
Juhas napisał(a)

Nie wiem, co mam Ci powiedzieć.
Coś tu kręcisz. Najpierw mówisz, że jak pozostawisz połączenie z bazą na trochę dłużej, to Ci się automatycznie zamyka(też tak miałem przy MySQL).
Potem mówisz, że otwierasz połączenie tylko raz.

To ile Ty masz połączeń do jednej bazy otwartych jednocześnie?

w data module mam przy create

konekszyn.Connected:=true;

a przy destroy false. Do tego przy kazdej procedurze odwolujacej sie do bazy mam open i close.

Nie wiem czy to jest poprawnie czy nie, ale robilem to wg tego:
http://4programmers.net/Delphi/Artykuły/MySQL_w_Delphi

0

Kladziesz glowny Connection na Formę, Query tworzysz dynamicznie albo tez kladziesz na forme i podpinasz polaczenie.
Do Query -> Query.SQL.Text := 'jakies tam zapytanie';
Query.Open

x := Query.RecordCount;

0
maciejmt napisał(a)

Wywal to DataModule :D

Kladziesz glowny Connection na Formę, Query tworzysz dynamicznie albo tez kladziesz na forme i podpinasz polaczenie...
Do Query -> Query.SQL.Text := 'jakies tam zapytanie';
Query.Open

x := Query.RecordCount;

Nie ma mozliwosci zeby nie dzialalo, bez zadnych fetchy czy innych kombinacji.

czyli wszystkie data module tez wywalic? a pobieranie danych z query jest takie samo jak z dataset?

a czym to sie tak w ogole rozni?

0
WombaT napisał(a)

czyli wszystkie data module tez wywalic?

oj, chodziło mi o dataset

0

a ja mam uwage merytoryczną konekszyn jak sie pisze ;)

moje pytanie wiec wywalamy open i close ??

0

Jak dajesz polecenie otwarcia wszystkich rekordów do kursora (select * from table) to trudno się dziwić, że serwer bazy danych może zostać zawieszony. Liczenie rekordów należy robić przez select count(*)from table where ...

0

a czym sie rozni TSQLQuery od TSQLDataSet ?

z tego co widze to tylko nazwą. moze nie jestem w stanie wyłapać jakichś istotnych różnic?

0
WombaT napisał(a)

a czym sie rozni TSQLQuery od TSQLDataSet ?

z tego co widze to tylko nazwą. moze nie jestem w stanie wyłapać jakichś istotnych różnic?

Działanie jest takie samo jeśli nastawisz CommandType na ctQuery. TSQLQuery ma wygodniejsze wielolinijkowe wprowadzanie polecenia sql, podczas gdy TSQLDataSet CommandText przechowuje polecenie sql w jednej linii co może być niewygodne do podglądu i zmiany, jeśli jest ono długie.

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