Entwickler-Ecke

Datenbanken - Wie komme ich an das Ergebnis eines Selects?


Andi1982 - Mi 14.05.03 20:13
Titel: Wie komme ich an das Ergebnis eines Selects?
Ok, ich weiss das ist eine absolute Anfängerfrage, aber irgendwie finde ich kein Tutorial in dem die Querys richtig erklärt sind.

Und zwar führe ich folgenden Qery aus:

Delphi-Quelltext
1:
2:
3:
Query1.SQL.Clear;
Query1.SQL.Text := 'Select max(Lied_ID) From lieder.db';
Query1.ExecSQL;

Jetzt würde ich gerne die Lied_ID um eins erhöhen und die neue ID dann beim nächsten insert verwenden, aber wie komme ich da ran??


Alibi - Mi 14.05.03 20:39

Mach aus dem Feld ID einfach ein Primären Index mitsamt Auto_INC, dann brauchst du das bei einem Insert nicht per Hand zu erhöhen, sondern er zählt automatisch weiter.


Andi1982 - Mi 14.05.03 20:44

ja ok, das ist auch eine Möglichkeit. Aber trotzdem wüßte ich gerne wie ich an die selektierte ID herankomme.


Alibi - Mi 14.05.03 20:58


Delphi-Quelltext
1:
showmessage(Query1.Fields[0].AsString);                    

Oder, wenn mehr als ein Ergebnis im Query ist:

Delphi-Quelltext
1:
2:
3:
4:
while not Query1.EOF do begin
  ShowMessage(Query1.FieldByName('MeinFeld').AsString);
  Query1.Next;
end;


kiwicht - Mi 14.05.03 22:18

erstens fällt mir auf, du führst deinen SQL-Text mit

Query.ExecSQL

aus. Ob's funktioniert, kann ich nicht beurteilen, weil ich es nie so mache. Warum? Weil doch dafür

Query.Open

gedacht ist, oder?

und ob das:


Delphi-Quelltext
1:
2:
3:
4:
while not Query1.EOF do begin 
  ShowMessage(Query1.FieldByName('MeinFeld').AsString); 
  Query1.Next; 
end;


so praktisch ist.... :?
Was ist wenn die Ergebnis-Menge an die 100 Datensätze hat? Öffnen sich dann nicht 100 Messages?

mfg[/delphi]


Alibi - Mi 14.05.03 22:24

Die 4 Zeilen sollten nicht praktisch sein, sondern nur das Prinzip verdeutlichen.
Und richtig, es muss Query1.Open heißen.
Bei Select immer .Open und wenn was geändert wird (Update, Insert, Delete usw), dann ExecSQL.


kiwicht - Do 15.05.03 00:42

;)

aber reicht nicht auch schon ein DBEdit-Feld, bzw. ein DBGrid? Dann brauch er sich darum keine Gedanken machen....

aber wurscht.. wollt mich nich groß einmischen....


Andi1982 - Do 15.05.03 07:07

Ok, also das ist mir jetzt soweit klar!

Aber nochmal angenommen ich hab folgenden Select:

Delphi-Quelltext
1:
2:
3:
Query1.SQL.Clear; 
Query1.SQL.Text := 'Select max(Lied_ID) From lieder.db'
Query1.Open;

Dann habe ich ja nicht direkt ein Feld meiner Tabelle sondern nur eine Ergebnistabelle mit nur einer zeile und einer spalte. wo meinetwegen 15 oder so drinsteht.

Dann kann ich ja nicht Query1.FieldByName('MeinFeld') verwenden weil ich MeinFeld ja keinen Namen zugewiesen habe.

Hat vielleicht irgendjemand was wo die ganze SQL-Syntax beschrieben ist? Hab eigentlich gedacht man mach in Delphi auch einfach einen "Select into" in ein Programmvariable und kann dann damit machen was man will. So läufts bei uns im Gechäft jedenfalls (DB2).


UGrohne - Do 15.05.03 08:35

Du kannst in Deinem SQL-Code auch die Spalten benennen, dann ist ein Zugriff à la

Delphi-Quelltext
1:
variable:=Query1.FieldByName('MeinFeld').AsString;                    


Dazu musst Du nur Folgendes schreiben:

Delphi-Quelltext
1:
Query1.SQL.Text := 'Select max(Lied_ID) as MeinFeld From lieder.db';                    


Und wenn Du ein Buch brauchst, dann hol Dir "Interbase -Dantebank entwicklung mit Delphi" vom Software & Support - Verlag. Das is ziemlich gut, hab ich auch hier rumstehen :wink:

Gruß


Andi1982 - Do 15.05.03 08:40

Ja ok,
ich glaub jetzt kann ich das nötigste. Was SQL-Syntax betrifft bin ich eigentlich fast schon Profi, aber auch nur im DB2-System. Dachte eigentlich dass SQL in den verschiedenen Datenbanken trotzdem immer die gleiche Syntax hat.

Also seid schonmal auf meine nächsten Probleme gespannt!


CenBells - Do 15.05.03 09:21

Hallo,

Du musst nicht unbedingt die Eigenschaft FieldbyName verwenden.

Bei deinem Select statement steht der wert auch in

LQuery.Fields[0].AsInteger;

und das buch, das Ugrohne ist echt sehr gut. Habe ich auch.

Gruß
ken


Andi1982 - Do 15.05.03 09:27

Ja, danke, ich glaub jetzt ist mirs wirklich klar.

@Alibi: Ein AUTO_inc will ich nicht benutzen da es vorkommen kann dass der letzte satz wieder gelöscht wird und ich aber eine durchgehende nummerierung will.