![]() |
Datenbank: SQL • Zugriff über: weiß ich noch nicht
Einlesen von SQL-Daten in Combobox
hi
Ich habe schon in Büchern und tutorials nachgelesn doch nirgends steht irgendwo genau beschrieben wie man von einer SQL Datenbank in eine Combobox einlest. Kann mir wer von euch weiter helfen oder ein gutes tutorial geben THX |
Re: Einlesen von SQL-Daten in Combobox
Hai cell,
zum einen könntest Du natürlich eine TDBComboBox verwenden. Aber hier ein Beispiel wie Du es machen könntest.
Delphi-Quellcode:
procedure TForm1.FillComboBox (aCB : TComboBox; aID, aField, aTable : string);
var myQuery : TZQuery; // Query für deine Datenbank begin aCB.Clear; myQuery := TZQuery.Create(nil); try myQuery.Connection := DBConnection; // Deine Connection myQuery.SQL.Text := Format ('SELECT %s, %s FROM %s ORDER BY %s', [aID,aField,aTable,aField]); myQuery.Open; while not (myQuery.Eof) do begin aCB.AddItem(myQuery.Fields[1].AsString,TObject(myQuery.Fields[0].AsInteger)); myQuery.Next; end; finally myQuery.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin FillComboBox(ComboBox1,'ID','Name','Test1'); end; |
Re: Einlesen von SQL-Daten in Combobox
Danke für deine Hilfe aber ich bin ein Delphi Neuling und kenne mich noch nicht so gut aus !
kannst du mir das ein bisschen erklären ?? thx |
Re: Einlesen von SQL-Daten in Combobox
Zitat:
Was genau ist dir bei dem Code denn nicht klar? Dann kann ich Dir diese Punkte gezielt erklären. |
Re: Einlesen von SQL-Daten in Combobox
So oder so ähnlich .... ^^
Delphi-Quellcode:
(der rest der bei Sharky noch dabei steht ist quasi "nur" zum verbindungsaufbau und zur Sauberen trennung ....)
myQuery.First; // anfang der DB
while not (myQuery.Eof) do // solange nicht EndOfFile begin Combobox.Items.Add(myQuery.Fields[1].AsString); // Eintrag aus Feld [1] zu Combobox Hinzufügen ... myQuery.Next; // nächster Datensatz end; |
Re: Einlesen von SQL-Daten in Combobox
Delphi-Quellcode:
myQuery.First; // anfang der DB
while not (myQuery.Eof) do // solange nicht EndOfFile begin Combobox.Items.Add(myQuery.Fields[1].AsString); // Eintrag aus Feld [1] zu Combobox Hinzufügen ... myQuery.Next; // nächster Datensatz end; myQuery.First; -----> ist des immer so oder kann ich da einen beliebigen namen nehmen Combobox.Items.Add-------> des is glaub ich klar =D myQuery.Fields[1].AsString------> des versteh ich ned warum Fields[1] myQuery.Next; --------> mit dem sag ich ihm dann das die nächste combobox kommt ??? thx |
Re: Einlesen von SQL-Daten in Combobox
Zitat:
Zitat:
Zitat:
.Fields[1] sagt einfach das die zweite spalte des Tabellen ergebnisses benutzt wird. Zitat:
|
Re: Einlesen von SQL-Daten in Combobox
Zitat:
ahh also kommt wieder der Befehl myQuery.Fields[2].AsString |
Re: Einlesen von SQL-Daten in Combobox
hier noch ein netter Artikel von Borland zu diesem Thema mit Blick richtung .net <g>
![]() :-) thomas |
Re: Einlesen von SQL-Daten in Combobox
thx
|
Re: Einlesen von SQL-Daten in Combobox
Zitat:
|
Re: Einlesen von SQL-Daten in Combobox
jop versteh schon DANKE
|
Re: Einlesen von SQL-Daten in Combobox
Als Delphi-Neuling würde ich die Antworten kaum verstehen. :-D Und für die Neulinge will ich das mal etwas näher erläutern. 8) Dreh und Angelpunkt ist der Source von Sharky. Und zwar die Zeile mit dem "SELECT". Damit fordert er eine genau definierte Datenmenge an. Liegt die nun vor, dann wandert er da durch zuerst mit First und dann solange mit next, bis er am Ende (EOF) ankommt. Das mit dem ComboBox.Add usw. ist ja klar.
Das mit dem Fields [1] gefällt mir allerdings nicht so gut. Ich verwende bei so was lieber FieldByName. Das macht den Source übersichtlicher, weil man sich nicht noch die Anordnung der einzelnen Felder merken muß. Die Einzelheiten mußt Du allerdings in der Hilfe selber zusammensuchen. :mrgreen: |
Re: Einlesen von SQL-Daten in Combobox
Zitat:
Zitat:
|
Re: Einlesen von SQL-Daten in Combobox
Zitat:
|
Re: Einlesen von SQL-Daten in Combobox
Zitat:
.FieldByName hat aber einen kleinen Nachteil bei der Geschwindigkeit. Es werden nämlich bei jedem Aufruf erst alle Felder durchlaufen um das Feld anhand des Names finden zu können. Wenn jetzt mal rein theoretisch 20 Felder und 10.000 Datensatze zurückgegeben werden bedeutet dies das beim Zugriff auf den Inhalt des zwanzigsten Feldes 20 * 10.000 = 200.000 AnsiCompareText durchgeführt werden müssen. |
Re: Einlesen von SQL-Daten in Combobox
aha
also in meiner Datenbank sind ziemlich viele Daten drinnen, denn die ist direkt an einen Bremsenprüfstand angeschlossen also werde ich glaube ich das mit den Fields[0] nehmen oder ?? thx für eure hilfe werde vielleicht noch eine frage haben! wie ich zu einem server connecten kann, aber ich schau mal in bücher nach ob ich es finde thx |
Re: Einlesen von SQL-Daten in Combobox
hatte mir schonmal ne Constante (z.B. Datum = 0; Benutzer = 1) gemacht .. so kann man mit Wörtern arbeiten und umgeht trotzdem 'AnsiCompareText' ... die Reihenfolge darf sich da natürlich dennoch NICHT ändern .. aber das wird glaub ich langsam OT ^^
|
Re: Einlesen von SQL-Daten in Combobox
eine andere möglichkeit ist eine inzidenztabelle bei programmstart zu generieren, die sich die reihenfolge der felder aus der db holt, dann kannste dir das auch sparen und hast so die flexibilität! nicht jeder arbeitet mit fixen db-strukturen :zwinker:
|
Re: Einlesen von SQL-Daten in Combobox
hehe nein nein ich glaube des wird schon so passen
:mrgreen: aber trotzdem danke :wink: |
Re: Einlesen von SQL-Daten in Combobox
Ganz OT finde ich das aber nicht. Schlimmer ist es, etwas aus dem Zusammenhang zu reißen. Deshalb noch eine Frage :
Ich gehe davon aus, mehr aber nicht, daß durch die Dataset Definition eine Stringlist o.ä. im Speicher liegt und das FieldByName nichts anderes macht, als lediglich diese durchzugehen. Aber doch nicht bei jedem Datensatz. Oder doch ? :mrgreen: Intern wird das wahrscheinlich sowieso über den Index der Stringliste geregelt. Oder anders rum gefragt : hat einer das mal getestet ? |
Re: Einlesen von SQL-Daten in Combobox
ähhhhh was :mrgreen:
|
Re: Einlesen von SQL-Daten in Combobox
ich gehe mal davon aus, dass sharkys beispiel darauf angelegt war, dass du jeden datensatz duchgehst um ihn z.b. in eine cobobox zu laden, dann wird sicherlich diese abfrage entsprechend oft durchlaufen, hier ist sicherlich der zugriff über den index angebracht!
|
Re: Einlesen von SQL-Daten in Combobox
ahhh kk
|
Re: Einlesen von SQL-Daten in Combobox
Die Reihenfolge der Felder entspricht NICHT der Reihenfolge in der Datenbank, sondern der Reihenfolge ihres Auftretens im SQL-Statement! (oder bei Zusammengeclickten der Reihenfolge in der Liste)
Solange man also das Select-statement nicht ändert (bei namentlich angegebenen Spalten), kann nix passieren. Problematisch wirds bei SELECT * FROM Foo. Hier ist die Reihenfolge wieder entsprechend der in der Datenbank (weil intern der * durch feld1, feld2,... ersetzt wird und diese Ersetztung wird aufgrund Informatinen der Systemtabellen vorgenommen wird), allerdings muß man in einem solchen Fall eh den Code zum Auslesen anpassen. |
Re: Einlesen von SQL-Daten in Combobox
Hallo Leute,
Zitat:
Habe meinen Test - ohne wissenschaftlichen Anspruch - sogar noch rumliegen. 10 Mio Zugriffe auf das letzte Attribut einer 21-stelligen Relation: 87s bei Zugriff per FieldByName(), 24s bei Zugriff über meinen NameIndex und 7s bei Zugriff über Index-Variable. Grüße vom marabu |
Re: Einlesen von SQL-Daten in Combobox
procedure TfrmTestauswahl.cbotestnummerChange(Sender: TObject);
myQuery.First; while not (myQuery.Eof) do begin qrMain.SQL.Text:='SELECT `Testnummer` WHERE `Testabschnitt=3`; Combobox.Items.Add(myQuery.Fields[0].AsString); end; end. Kann man das so schreiben oder sind da gravierende Fehler drinnen?? wenn ja welche |
Re: Einlesen von SQL-Daten in Combobox
sry hab noch nicht gesagt was ich machn will!!
also ich mach ein neues Fenster auf wo eien combobox ist. beim aufmachn schon soll sich die Combobox mit den daten aus der Tabelle Testnummer füllen wo der testabschnittt 3 ist |
Re: Einlesen von SQL-Daten in Combobox
Erstmal fehlen die delphi-tags in deinem Beitrag.
Dann fehlt ComboBox.Items.Clear - die Box wird so mit der Zeit recht voll. Und dann musst dich noch entscheiden, wann du mit qrMain und wann mit myQuery arbeitest. marabu |
Re: Einlesen von SQL-Daten in Combobox
procedure TfrmTestauswahl.cbotestnummerChange(Sender: TObject);
myQuery.First; while not (myQuery.Eof) do begin myQuery.SQL.Text:='SELECT `Testnummer` WHERE `Testabschnitt=3`; ComboBox.Items.Clear Combobox.Items.Add(myQuery.Fields[0].AsString); end; aber was meinst du mit delphi tags??? |
Re: Einlesen von SQL-Daten in Combobox
Oberhalb von dem Fenster, in dem du deinen Beitrag schreibst, ist ein Button "Delphi-Code". Hau drauf, bevor du deinen Quellcode schreibst und nochmal, wenn du fertig bist. Dann sieht dein Beitrag etwa so aus:
Delphi-Quellcode:
marabu
procedure TfrmTestauswahl.FormCreate(Sender: TObject);
begin ComboBox.Items.Clear; with myQuery do begin SQL.Text := 'SELECT Testnummer FROM Test WHERE Testabschnitt = 3 ORDER BY Testnummer'; Open; while not Eof do begin Combobox.Items.Add(myQuery.Fields[0].AsString); Next; end; Close; end; end; FROM-Klausel nach Hinweis von Sharky eingefügt |
Re: Einlesen von SQL-Daten in Combobox
Delphi-Quellcode:
delphi tags sind: [_delphi_] und [_/delphi_] ohne die "_" oder drück einfach beim editieren den button "delphi-code"
procedure TfrmTestauswahl.cbotestnummerChange(Sender: TObject);
begin ComboBox.Items.Clear myQuery.SQL.Text:='SELECT Testnummer WHERE Testabschnitt = 3 ORDER BY Testnummer'; myQuery.Open; myQuery.First; while not (myQuery.Eof) do Combobox.Items.Add(myQuery.Fields[0].AsString); end; |
Re: Einlesen von SQL-Daten in Combobox
Delphi-Quellcode:
kann ich das so übernehmen ??
procedure TfrmTestauswahl.cbotestnummerChange(Sender: TObject);
begin ComboBox.Items.Clear myQuery.SQL.Text:='SELECT Testnummer WHERE Testabschnitt = 3 ORDER BY Testnummer'; myQuery.First; while not (myQuery.Eof) do Combobox.Items.Add(myQuery.Fields[0].AsString); end; bzw statt
Delphi-Quellcode:
gehört
Combobox.Items.Add(myQuery.Fields[0].AsString);
Delphi-Quellcode:
oda ??
cbotestnummer.Items.Add(myQuery.Fields[0].AsString);
|
Re: Einlesen von SQL-Daten in Combobox
Hi cell,
der von dir vorgeschlagene Code funktioniert garantiert nicht. Du legst das SQL-Statement fest, aber startest die Anfrage (myQuery.Open) an die Datenbank gar nicht. Dann verwendest du eine Schleife ohne Ende-Kriterium. Es ist dir vielleicht nicht aufgefallen, aber für den Fall, dass du mehrere Testnummern in deiner ComboBox haben wolltest, habe ich deinen Code in meinem letzten Beitrag bereits an deine Bedürfnisse angepasst. Du musst nur noch darauf achten, dass du die richtigen Namen einsetzt. Einfach übernehmen ist wohl keine gute Idee. Du solltest den Code auch verstehen. Was du über die Online-Hilfe nicht klären kannst, frage hier nach. marabu |
Re: Einlesen von SQL-Daten in Combobox
Hai,
neben der Ausführung von marabu wird der Code zur Laufzeit einen Fehler verursachen weil das SQL-Statement einen Fehler hat. Es wird nämlich nicht angegeben auf welche Tabelle es sich bezieht. Allgemein muss der Aubau so sein:
Code:
Bei deinem Statement fehlt das FROM.
[b]SELECT[/b] [i]feldnamen[/i] [b]FROM[/b] [i]tabellennamen[/i]
|
Re: Einlesen von SQL-Daten in Combobox
hätte noch eine Frage zuu einem Quelltext
Delphi-Quellcode:
das hat marabu geschrieben und ich wollte wissen was das
procedure TfrmTestauswahl.FormCreate(Sender: TObject);
begin ComboBox.Items.Clear; with myQuery do begin SQL.Text := 'SELECT Testnummer FROM Test WHERE Testabschnitt = 3 ORDER BY Testnummer'; Open; while not Eof do begin Combobox.Items.Add(myQuery.Fields[0].AsString); Next; end; Close; end; end;
Delphi-Quellcode:
macht weil hier zeigt es mir einen Fehler an
with myQuery do begin
thx |
Re: Einlesen von SQL-Daten in Combobox
Zitat:
myQuery ist ein Platzhalter für deine Query, wie auch immer die heißen mag - oder hast du Probleme mit dem with-block? marabu |
Re: Einlesen von SQL-Daten in Combobox
Delphi-Quellcode:
undefinierteer Bezeichner: 'myQuery'
Zitat:
Delphi-Quellcode:
SQL.Text := 'SELECT Testnummer FROM friktionstest;
|
Re: Einlesen von SQL-Daten in Combobox
könnte bitte jemand auf die Fragen antworten oder mir ein gutes Tutorial geben wo das drinnen steht
thx |
Re: Einlesen von SQL-Daten in Combobox
Mit SQL ist das so: du schreibst auf was du wissen willst:
Delphi-Quellcode:
Dann musst du deine Anfrage noch an den Server schicken:
myQuery.SQL.Text := 'SELECT Testnummer FROM friktionstest WHERE ... ORDER BY ...';
Delphi-Quellcode:
Weil der Server sich ein paar Resourcen dafür zurecht gelegt hat, solltest du ihm auch wieder Bescheid sagen, wenn du fertig bist:
myQuery.Open;
Delphi-Quellcode:
Klarer jetzt?
myQuery.Close;
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz