Entwickler-Ecke
Datenbanken - DBGrid - Anzahl der Zeilen ermitteln / suchen
PSi - Mo 14.04.03 15:09
Titel: DBGrid - Anzahl der Zeilen ermitteln / suchen
Hallo Forum,
ich habe ein kleines Problem: bei mir kommt Delphi3Pro zum Einsatz und als Datenbankserver MySQL über ODBC.
Ich hab ein Formular mit SQL-Query, DataSource und DBGrid Komponente. Über Query frage ich Daten (2 Spalten) ab und speichere sie in DBGrid.
Nun möchte ich aber die Anzahl der Zeilen von DBGrid herausfinden bzw. ich suche einen Eintrag in der 2 Spalte. Leider gelingt mir das nicht ! Was mache ich falsch?
Habe auch schon, wie in der Online-Hilfe beschrieben, mit TBookmarkList gearbeitet, das geht aber auch nicht:
DBGrid1.SelectedRows.Count oder
Quelltext
1:
| DBGrid1.SelectedRows.IndexOf |
Gut, ich könnte mich ja in der Datenmenge von Query bewegen, aber das möchte ich nicht :(
Sollte ich vielleicht doch lieber StringGrid statt DBGrid nehmen?
Vielen Dank im voraus
Gruss - PSi
infomio - Mo 14.04.03 15:32
du greifst via sql zu, dann versuchs doch mal mit:
sqlxyz.Rowsaffected (gibt integer zurück).
hoffe ich habe deine Frage richtig verstanden!
PSi - Mo 14.04.03 15:45
Hallo infomio,
vielen Dank für deine Antwort.
Ja, ich greife über SQL auf die Datenbank zu, gebe die Daten an die DBGrid-Komponente und schliesse wieder sofort die Verbindung:
Quelltext
1: 2: 3: 4:
| Query1.SQL.Clear; Query1.SQL.Add('SELECT * FROM meineTabelle;'); Query1.Open; Query1.Close; |
DBGrid ist über DataSource mit der Query verbunden! DBGrid zeigt mir auch die richtigen Daten an.
Auf dem Formular habe ich nun die Möglichkeit gegeben, neue Datensätze hinzuzufügen, auch über SQL (also INSERT INTO ...).
Nun soll aber vor der SQL-Anweisung geprüft werden, ob der Datensatz schon existiert.
Und deshalb möchte ich die DBGrid-Zeilen einzeln abklappern bzw. suchen.
Vielleicht bin ich hier falsch, ich müsste unter Datenbanken posten, aber die Frage handelt sich eigentlich um eine VCL-Komponente - sorry Moderator :oops:
Gruss - PSi
infomio - Mo 14.04.03 23:11
Nun, ich weiß nicht...in einem Multiuser-Sytem ist es fast unabdinglich nachzulesen (über eine weitere SQL-Anweisung) , ob es den Datensatz schon gibt oder nicht. Im Single-User System willst du aber eigentlich nur wissen, ob der Satz im Grid schon angezeigt wird. Was hindert dich daran, die Datensätze nochmal zu durchfordten??? Ist es die Laufzeit?
Mal ein Beispiel: du hast eine Tabelle mit 100000 Sätzen, schon recht ordentlich. Du willst wissen, ob der Satz mit de ID 16767 schon vorhanden ist. Wenn du eine Tabelle generiert hast mit ID = primary key, dann brauchst du nicht einmal einen Index anzulegen, der ist über den Key eh schon vorhanden. select * from Tabelle where ID = 16767 geht mit dem davor gestellten if not SQL.prepared then SQL.prepare rasend schnell, da das Datenbank-Management-System immer schneller ist als jegliche Art der DataSource-Handling oder DBGrid-Handling-Geschichten. Ich habe das in Millisekunden belegen können ! Und noch dazu bekommst du über ODBC oder BDE fast nie alle Datensätze auf deine Computer, sondern nur ein Fragment bei größeren Sätzen. Des Weiteren ist es nicht verkehrt, weil im Falle von Multiusern-Systemen du fast nichts ändern brauchst, vielleicht nur ein paar Transaktionen einfügen. Meiner Erfahrung nach - Ich bin zwar nur Junior-Member, habe trotzdem schon ... egal... fährst du mit der Methode Vor dem Speichern Nachlesen obe noch da oder nicht immer am besten, da die Möglichkeit in der selben Millisekunde einen Satz zu ändern äußerst gering ist!
PSi - Di 15.04.03 11:30
Hi,
ja da hast du Recht :roll:
das Programm soll mal eines Tages im Multiuser-Modus laufen; ich wollte im Prinzip nur die Daten von der Datenbank holen, Verbindung wieder sofort schliessen, Daten editieren und bei Abschluss wieder per SQL die Änderungen vornehmen.
Eigentlich hatte ich vor, alles über Querys, und das nur bei Bedarf, zu verwalten, anstatt einzelne Tabellen mit Komponenten zu verbinden.
Ich war nur erstaunt, daß DBGrid so eine Methode nicht kennt - obwohl ja DBGrid direkter Nachfahrer von StringGrid ist, oder nicht?
Nun habe ich das anders gelöst, ich ermittle die Anzahl der Datensätze bzw. suche im Datenbestand per Query.Fields[1].AsString / Query.RecordCount
Vielen Dank für deine Antwort und schönen Tag noch 8)
Gruss
PSi
Seraph - Fr 25.01.08 11:35
Titel: SELECT ohne DataSource und DBGrid
Hi Leute!
Hier noch etwas für diejenigen die das Forum durchsuchen und nicht das passende finden ;-)
::::
Ich habe die ADO-Komponenten benutzt und gehe davon aus, dass jemand schon mit der
Connection-Komponente eine Verbindung hergestellt hat.
Ich habe die ADOQuery-Komponente benutzt und sie über die Connection-Schnittstelle mit
meiner ADOConnection-Komponente verknüpft. (eh klar!)
Hier ein kleines Beispiel:
Es liest von jedem Datensatz den Inhalt des ersten (0ten) Feldes in einer MessageBox aus...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure EineProzedur(); var i, rowcount: integer; begin ADOQuery1.SQL.Add('SELECT SrcPath FROM RepositoryObjects'); ADOQuery1.Active := true; rowcount := ADOQuery1.RecordCount; for i := 0 to (rowcount - 1) do begin ShowMessage(ADOQuery1.Fields[0].AsString); if(i < (rowcount - 1)) then ADOQuery1.FindNext; end; end; |
Um jedes Feld eines Datensatzes auszulesen, müsste man in der for-schleife
noch eine zweite öffnen, die den ADOQuery1.FieldCount durchzählt!
Hoffe es nutzt jemand auf eine Schnelle Lösung seines Problems zu kommen! :roll:
Gruß,
Seraph
raiguen - Mo 28.01.08 12:26
PSi hat folgendes geschrieben: |
...Ja, ich greife über SQL auf die Datenbank zu, gebe die Daten an die DBGrid-Komponente und schliesse wieder sofort die Verbindung:
Quelltext 1: 2: 3: 4:
| Query1.SQL.Clear; Query1.SQL.Add('SELECT * FROM meineTabelle;'); Query1.Open; Query1.Close; |
DBGrid ist über DataSource mit der Query verbunden! DBGrid zeigt mir auch die richtigen Daten an.
|
:roll: Ich bezweifle, dass du mit einer geschlossenen Query im DBGRid die Daten sehen kannst :roll:
PSi hat folgendes geschrieben: |
...geprüft werden, ob der Datensatz schon existiert....
...Gut, ich könnte mich ja in der Datenmenge von Query bewegen, aber das möchte ich nicht :( ... |
Warum das denn nicht? Suchen in der Datenmenge von ner Query geht doch recht einfach so:
Delphi-Quelltext
1: 2: 3: 4: 5:
| if Query1.Locate('{Feldname}', , []) then ShowMessage('Datensatz vorhanden') else ... |
Schau mal in der OH Stichwort
Locate nach weiteren Informationen ;)
Andere Möglichkeit, nach einem vorhandenen Datensatz zu suchen-> eine weitere Query absetzen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| ... qrySuch.SLQ.Text := 'SELECT Feldname FROM MeineTabelle WHERE Feldname=Suchbegriff'; qyrSuch.Open; if qrySuch.RecordCount = 0 then ... else ... |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!