| Autor |
Beitrag |
PSi
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 14.04.03 15:09
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
      
Beiträge: 110
Win xy
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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
Gruss - PSi
|
|
infomio
      
Beiträge: 110
Win xy
|
Verfasst: 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 
Hält's aus hier
Beiträge: 6
|
Verfasst: Di 15.04.03 11:30
Hi,
ja da hast du Recht
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
Gruss
PSi
|
|
Seraph
      
Beiträge: 163
Windows.:siXPack:.
Delphi7 Professional
|
Verfasst: 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!
Gruß,
Seraph
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Mo 28.01.08 12:26
|
|
|