Entwickler-Ecke

Datenbanken - RecordCount stop immer bei 1


rolli2 - Mi 04.11.09 17:09
Titel: RecordCount stop immer bei 1
Also ich benutze Firebird und Recordcount gibt bei vorhandenen Namen immer 1 wieder habe extra in die Datenbank 3 mal den Namen eingetragen er findet bzw gibt nur immer 1 wieder.

SqlAbfrage

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TDataModuleMain.VornameSuchen;
begin
  with IBSQLMain do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ma.Vorname');
    SQL.Add('  FROM TblMitarbeiter ma');
    SQL.Add('  WHERE ma.Vorname = :Vorname');
    ParamByName('Vorname').AsString:=  [b]Vorname[/b];
    ExecQuery;
    if RecordCount > 0 then
      MessageDlg((IntToStr(IBSQLMain.RecordCount) + ' mal gefunden!! '),
                  mtConfirmation, [mbOK],0)
    else
      MessageDlg('Mitarbeiter nicht gefunden!!',mtConfirmation, [mbOk],0);
    Close;
    end;
end;

Vorname ist eine public Variable damit ich sie mit EditVorname.Text eingeben kann

ButtonClick

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TSDIAppForm.Button2Click(Sender: TObject);
begin
  DataModuleMain.Vorname := EditVorname.Text;
  DataModuleMain.VornameSuchen;
  DataModuleMain.Vorname := '';
  EditVorname.Clear;
end;


Woran liegts??? Er sollte eigentlich bei den Namen "3 mal gefunden" angeben.
Jedoch wird nur "1 mal gefunden" ausgegeben.

Moderiert von user profile iconUGrohne: Beitragsformatierung überarbeitet.


Andreas L. - Mi 04.11.09 18:03

Ich vermute das du ExecQuery aufrufen musst bevor du über

Delphi-Quelltext
1:
ParamByName('Vorname').AsString:= Vorname;                    
auf die Tabelle zugreifst.


jasocul - Mi 04.11.09 18:03

Mach mal nach dem Öffnen der Tabelle ein FetchAll.


Sinspin - Mi 04.11.09 19:02

Nimm zum probieren ob es an RecordCount liegt mal :

SQL-Anweisung
1:
SELECT Count(*) As RC FROM....                    

Und lies dann mal via FieldByName('RC').AsInteger den Wert aus der da kommt. Das müsste dann eigentlich die passende Anzahl sein.
Wenn das nicht passt sind deine drei gleichen Namen nicht gleich.


UGrohne - Mi 04.11.09 21:03

jasocul liegt hier schon richtig. Nach ExecQuery liegt der Datensatzzeiger auf dem ersten Element und nur wenn über ein Element iteriert wurde, wird es auch gezählt. Mittels FetchAll holst Du alle Rows von der Datenbank in Deinen Speicher und kannst sie dann auch zählen. Ich würde dies aber nur tun, wenn es nicht sehr viele sind und Du mit den Datena uch wirklich etwas machen willst. Zum Spaß 100.000 Datensätze zu holen, ist nicht sinnvoll. Wenn Du nur die Anzahl brauchst, ist ein simples Count wie von Sinspin sehr viel sinnvoller.


Xentar - Mi 04.11.09 21:31

Jo, das Problem wurde ja schon erklärt.

Noch eine Anmerkung: Ich selber bin der Meinung, dass man with ... do ... möglichst vermeiden sollte.
Kann zu sehr merkwürdigen Effekten führen, spätestens, wenn du mehrere With verschachtelst, und nimmer weißt, welches davon der Compiler nun wirklich verwendet.

Ist nur ne persönliche Meinung - ich mach da lieber nen Bogen drum, und schreib alles aus (bzw. Copy Paste)