首页 > 解决方案 > 关于 SQL 语句的语法,我错过了什么?

问题描述

我正在编写代码以将用户名和密码插入到名为 Users 的数据库中。

当我尝试运行代码时,它说 INSERT 语句的语法有错误,但我终生无法找到它。

我正在使用另一个名为 RunSQL 的函数运行 SQL 语句,如果需要,我可以提交该函数,但它与我使用它运行的所有其他 SQL 语句都可以正常工作。

用户表有以下列及其数据类型 User_ID - 自动编号(主键) 用户名 - 短文本 密码 - 短文本

我尝试在要插入表中的值周围添加“”,并删除 & 并使其成为一个连续的字符串。我尝试添加/删除 ; 但没有任何效果。

Dim sql As String = "INSERT INTO Users (Username, Password) " &           
"VALUES (" & username_Textbox.Text & " , " & password_Textbox.Text & ");"
RunSQL(sql)
MessageBox.Show("User Added")

Private Sub RunSQL(ByVal sql As String)
    Dim conn As OleDbConnection = New 
    OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Paper_Gen_Database.accdb;")
    conn.Open()
    Dim cmd As New OleDbCommand(sql, conn)
    cmd.ExecuteNonQuery()
    System.Threading.Thread.Sleep(500)
End Sub

该代码应该从用户名和密码文本框中获取值并将它们插入到用户表中,但到目前为止它只抛出了一个 SQL 错误。

当“bh106”作为用户名,“ZLTga”作为密码时,这就是 SQL 语句的样子

标签: sqlvb.netinsertsyntax-error

解决方案


这是使用参数的一种方式。使用参数非常重要,否则您将面临 SQL 注入的风险,这可能会破坏您的数据库。实际上,以这种方式编写 SQL 语句要容易得多,因为您不必担心字符串中的所有引号是否正确。

Using...End Using即使出现错误,这些块也可确保您的数据库对象已关闭和处置。这很重要,因为它会释放所有正在使用的非托管资源。

在实际应用程序中,您永远不会将密码保存为纯文本,但这是另一天的主题。

Private Sub InsertUser()
    Dim sql As String = "INSERT INTO Users (Username, [Password]) VALUES (@username, @password);"
    Using conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Paper_Gen_Database.accdb;")
        Using cmd As New OleDbCommand(sql, conn)
            cmd.Parameters.Add("@username", OleDbType.VarChar).Value = username_Textbox.Text
            cmd.Parameters.Add("@password", OleDbType.VarChar).Value = password_Textbox.Text
            conn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
    MessageBox.Show("User Added")
End Sub

在 Access 中,添加参数的顺序必须与它们在 SQL 语句中出现的顺序相匹配。


推荐阅读