尝试运行登录表单vb.net时出错



这是我的代码…

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

最新更新