2016-04-17 21 views
2

Ich versuche, ein Login-Fenster mit MDI zu erstellen. Es ist mit einer SQL Server-Tabelle test verbunden. Ich habe die Datentypen geändert und die Datenbank gelöscht und neu erstellt. Ich habe 2 Spalten: usr und pwd des Datentyps nvarchar.Ungültiger Spaltenname während Spalte dort ist

Dim connetionString As String 
Dim cnn As SqlConnection 

connetionString = "Data Source=.;Initial Catalog=test;User ID=sa;Password=sasql" 
cnn = New SqlConnection(connetionString) 

Dim cmd As SqlCommand 
Dim myreader As SqlDataReader 
Dim query As String 

query = "Select usr From users WHERE (usr =" + TextBox1.Text + " and pwd = " + TextBox2.Text + ")" 
cmd = New SqlCommand(query, cnn) 

cnn.Open() 
myreader = cmd.ExecuteReader() 

If myreader.Read() Then 
Else 
    MessageBox.Show("Incorrect username/password !", "LOGIN ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 
End If 

cnn.Close() 

Vielen Dank.

+2

Um Ihr spezifisches Problem zu beheben, müssen Sie Anführungszeichen in Ihrer SQL-Zeichenkette um die Werte setzen, die aus der db kommen. Aber das ist die geringste Ihrer Sorgen. Nachschlagen Parametrierung und SQL-Injektion. Hör auf und mach das JETZT, bevor du weiter gehst. – sasfrog

+0

Thx Sasfrog. Ich bin ein Anfänger und mache es zum Spaß. Ich werde tief hineingehen. – Jad

+0

Der beste Ansatz für das Erstellen einer Zeichenfolge besteht darin, sie nach dem Erstellen zu überprüfen. Sie können ohne Anführungszeichen sehen, warum Sie diese Nachricht von der Datenbank erhalten haben. – sasfrog

Antwort

1

Wenn Sie Tortuga.Chain verwenden, würde der Code wie folgt aussehen:

Dim ds As New SqlServerDataSource(connetionString) 

Dim user = ds.From("users", new With {.usr = TextBox1.Text, .pwd = TextBox2.Text}).ToString.Execute(); 

If user Is Not Nothing Then 
Else 
    MessageBox.Show("Incorrect username/password !", "LOGIN ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 
End If 

Wenn Sie rohe ADO.NET Code halten wollen, müssen Sie eine parametrisierte Abfrage verwenden.

0

Entfernen Sie die Leerzeichen vom Wert connectionString.

Ihre Abfrage vergleicht Textdaten, die ungültig sind, es sei denn, der Benutzer gibt ' am Anfang und Ende der Textfelder ein. Dies wäre syntaktisch korrekt:

"Select usr From users WHERE (usr ='" + TextBox1.Text + "' and pwd = '" + TextBox2.Text + "')" 

aber logisch fehlerhaft, da der Benutzer bösartigen SQL in Ihre Textfelder zu injizieren könnte versuchen. Ihre Anwendung ist äußerst unsicher. Sie müssen protect it against SQL injection und Sie müssen encrypt the password des Benutzers auch.

+0

Sie wissen, dass es falsch ist, warum also ein Beispiel anbieten, das keine parametrisierte Abfrage verwendet? –

+0

@ JonathanAllen, wer hat dieses Beispiel "angeboten"? Welcher Teil von "aber logisch fehlerhaft" hat dich verwirrt? Ich beschrieb, dass es sntaktisch korrekt, aber logisch fehlerhaft wäre. Sie stimmen also meiner Aussage nicht zu, indem Sie mir zustimmen. Gratulation :) –

+0

Es ist nicht nur "logisch fehlerhaft", es funktioniert nicht. Wenn mein Benutzername "O'Malley" ist, werde ich deinen Code brechen, ohne einen SQL-Injection-Angriff zu versuchen. –

Verwandte Themen