这是我的代码…
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Dim con As SqlConnection
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
con = New SqlConnection("Server=localhostSQLEXPRESS;Database=Vehicle;Trusted_Connection=True;")
con.Open()
Dim dr As SqlClient.SqlDataReader
Dim cmd As New SqlClient.SqlCommand("SELECT * FROM [user] where userid= " + txtuser.Text + " AND password= " + txtpass.Text + "", con)
dr = cmd.ExecuteReader
If dr.Read Then
MsgBox("Succesfully loggedin")
End If
con.Close()
End Sub
End Class
当我尝试运行程序时,它显示这个错误:
类型为"System.Data.SqlClient"的未处理异常。SqlException' occurred in System.Data.dll
附加信息:无效的列名'admin'.
列名'admin'无效。
'admin'是存储在'Vehicle'数据库下'user'表下的userid列中的值。我正在为我们的办公室创建一个小的Win应用程序,但是我一直忙于这个,这也是我的实践的一部分。
谢谢大家的帮助。
我将从一个警告开始:使用SQLParameter来避免SQL注入!
在这种情况下,问题是你传递了这样一个SELECT:
SELECT * FROM [user] where userid = admin
SQL Server认为admin是一个列名。
正确的语法是:
SELECT * FROM [user] where userid = 'admin'
你需要转义你的文本。这是你的DB看到的:
SELECT * FROM [user] where userid= admin AND password= somepass
这是你想让它看到的:
SELECT * FROM [user] where userid= 'admin' AND password = 'somepass'
要解决这个问题,重新编写代码:
"SELECT * FROM [user] where userid= ' '" + txtuser. "文本+"' AND password= '"+ txtpass。文字+ "'"
(注意单引号)
您还应该担心如果用户名或密码包含一个单引号会发生什么,您可以通过执行Replace(txtuser.Text,"'","''")
需要对内容txtUser进行封装。Text和txtPass。用撇号表示的文本,以转义它们。您当前正在尝试匹配名为admin的列。
例如,
Dim cmd As New SqlClient.SqlCommand("SELECT * FROM [user] where userid='" & txtuser.Text & "' AND password='" & txtpass.Text & "';", con)
dr = cmd.ExecuteReader
你真正应该做的是这样的事情;
Dim cmd As New SqlClient.SqlCommand("SELECT * FROM [user] WHERE userid=@U AND password=@P;", con)
cmd.Parameters.Add("@U", SqlDBType.NVarChar).Value = txtUser.Text.Trim
cmd.Parameters.Add("@P", SqlDBType.NVarChar).Value = txtPass.Text.Trim
dr = cmd.ExecuteReader