SQL Datenbank

Hallo ihr Lieben,

Ich möchte eine SQL Datenbank auf einen Webserver platzieren.

Zugegriffen wird von Clients und einem Admin Proggi

Alles VB.Net 2008

So zum üben mache ich es erstmal Local.

Datenbank ist erstellt mit der Tabelle User.

Diese hat zwei spalten:

Account
Nummer

Jetzt möchte ich folgendes:

Ich habe

eine Form
eine Textbox
und ein Label

Ich möchte das der Wert in der Textbox, in der Tabelle Spalte Account gesucht wird und die Zeile dann nach rechts geht und mir die Nummer als Variable zurück gibt.

Zum besseren verständnis:

Das was ich will kann man mit Excel einfach dastellen!

Formel in Zelle C5
=SVERWEIS(C2;Daten!A1:B5;2;FALSCH)

Zelle C2 wäre dann meine Textbox
Zelle C5 wäre dann das Label
A1:B5 wäre der Daten bereich als z.B. Database1
2 Ist der Spalten Index

Liebe Leute kann mir einer sagen wie ich das in VB.Net 2008 mit einer SQL hinbekomme?

nette grüße sven

Habs Jetzt so gemacht:

'Gesuchten eintrag auf Datenbank holen und in Listbox1 schreiben
Dim con As New OleDb.OleDbConnection
Dim cmd As New OleDb.OleDbCommand

Dim reader As OleDb.OleDbDataReader

con.ConnectionString = _
„Provider=Microsoft.Jet.OLEDB.4.0;“ & _
„Data Source=G:\Server\NetUserDatabase.mdb“
cmd.Connection = con
cmd.CommandText = („SELECT * FROM Accounts WHERE Account=’“ & TextBox1.Text & „’“)

Try
con.Open()
reader = cmd.ExecuteReader()
ListBox1.Items.Clear()
Do While reader.Read()
ListBox1.Items.Add(reader(„Account“) & " # " & reader(„Guthaben“))
Loop
reader.Close()
con.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try

'Die daten in einen String packen:

Dim dasissis As String

For i = 0 To ListBox1.Items.Count - 1
dasissis = (ListBox1.Items(i))
Next

'String auseinandernehmen und in Label das Guthaben anzeigen

Dim anzahl As String
Dim gesamt As String

anzahl = dasissis.IndexOf("#") + 3
gesamt = dasissis.Length

'Jetzt den gewünschten wert anzeigen
Label3.Text = Mid(dasissis, anzahl, gesamt)

Erst lass ich nach dem Wert suche
Dann lass ich die ganze Zeile anzeigen in einer Listbox
Dann wird der Item gespeichert in einem String
Ich zähle die Zeichen bis zu der Raute wo die nächste spalte anfängt.
Ich zähle die Gesamt länge
Ich schneide mir den String zurecht

Und OLA das ist doch Geil!!!

Und das beste ist egal wie lang die Zahlen sind ermachts trozdem.

Wenn ihr andere Foschläge habt wie man sowas lösen kann einfach vorschlagen.

MFG

Sven

Hallo!

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.), ist die folgende Zeile ein richtiges No-Go:

cmd.CommandText = („SELECT * FROM Accounts WHERE
Account=’“ & TextBox1.Text & „’“)

1.) (kleineres Übel) warum holst Du Dir ‚*‘, wenn Du doch nur 2 Spalten brauchst?
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; –

Gruß,
Martin

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?

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.

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.

Gruß,
Martin

Den GrußZurück vergessen

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 :smile:
(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

1 Like