Hallo!
hallo zurück
Ich hab’ mir die Lösung jetzt zwar nicht im Detail angeschaut,
aber abgesehen davon, dass es mir sehr umständlich scheint
(aus der DB auslesen, in eine LB formatieren, um dann die
Items wieder auszulesen und nochmal zu parsen usw.),
Und wie würdest du es machen?
Hallo nochmal!
Das kommt darauf an, was Du genau willst. In der ersten Beschreibung hast Du von genau einem Wert gesprochen, der angezeigt werden soll, in Deiner Lösung hantierst Du aber mit einer Listbox rum, in die mehrere Werte gepackt werden.
Die Kontonummern sind vermutlich eindeutig in der Tabelle, oder? Vielleicht sogar Primärschlüssel?
Dann macht es keinen Sinn, im DataReader eine Schleife zu durchlaufen, wenn es per Definition eh’ immer nur maximal einen Wert geben kann.
Das OleDbCommand hat übrigens auch eine weitere Methode: ExecuteScalar(), mit der Du sehr kompakt einen einzelnen (skalaren, daher der Name) Wert abfragen kannst.
Statt dem ganzen ExecuteReader-Gekaspere kannst Du einfach schreiben:
Dim anzahl As String
anzahl = CStr(cmd.ExecuteScalar())
1.) (kleineres Übel) warum holst Du Dir ‚*‘, wenn Du doch nur
2 Spalten brauchst?
ich hab das nicht richtig verstanden warum das „*“ überhaupt
da ist kannst du mir das erläutern.
Das ‚*‘ bedeutet: Liefere die Werte aller Spalten des Ergebnisses/der Tabelle zurück. Du bist aber nur an der Spalte Guthaben interessiert. Vielleicht hat Deine Tabelle später mal wesentlich mehr Spalten und es läuft nicht alles lokal, dann könntest Du mit einem expliziten
SELECT Guthaben FROM Accounts ...
einiges an Netzwerktraffic sparen.
ist die
folgende Zeile ein richtiges No-Go:
cmd.CommandText = („SELECT * FROM Accounts WHERE
Account=’“ & TextBox1.Text & „’“)
2.) (kritisches Problem) Wenn Du Deine SQL-Abfrage so
zusammenstückelst, kannst Du ausgesprochen leicht das Opfer
von sog. SQL Injection-Angriffen werden.
Überleg’ mal, was passiert, wenn in die Textbox eingegeben
wird:
1’; DELETE FROM Accounts; –
Das kann nicht passieren, der Text muss im Format einer
Emailadresse sein, ist kein „@“ oder „.“ drinne kommt eine
Fehler Meldung und der Code Stopt.
Bist Du Dir wirklich zu 100% sicher, dass das nie vorkommen kann?
Ganz bestimmt?
Nie und nimmer?
Wenn Du mit so einem - entschuldige den Ausdruck - versaubeuteltem Programmierstil anfängst, wirst Du früher oder später auf jeden Fall in die Verlegenheit kommen, dass Du für so eine SQL-Injection anfällig bist.
Die Lösung sind sog. parametrierte Abfragen: Du stückelst Dir die SQL-Abfragen nicht direkt als fertigen String zusammen, sondern verwendest an der Stelle, wo Platzhalter verwendet werden, eine entsprechende Kennzeichnung. Die Werte für die Platzhalter fügst Du dann explizit dazu, dann kann nichts durch Ausnutzen von irgendwelchem Schweinkram passieren, an den Du in dem Moment, wo Du programmierst, nicht gedacht hast.
Also z.B. so:
' con und cmd wie bisher erzeugen, aber dann:
cmd.CommandText = "SELECT Guthaben FROM Accounts WHERE Account='?'"
cmd.Parameters.AddWithValue("@Account", TextBox1.Text);
con.Open()
dim Guthaben as String
Guthaben = CStr(cmd.ExecuteScalar())
con.Close()
Label3.Text = Guthaben
Wenn Du dann noch Deinen Steuerelementen vernünftige Namen gibst, bin ich glücklich
(Hab’ neulich ein sehr schönes Zitat zum Thema gefunden: „Give your controls proper names! You have a proper name, or are you called Child1?“)
Gruß,
Martin