关于SQL语句的语法,我遗漏了什么?

关于SQL语句的语法,我遗漏了什么?,sql,vb.net,insert,syntax-error,Sql,Vb.net,Insert,Syntax Error,我正在编写代码,将用户名和密码插入名为Users的数据库中 当我试图运行代码时,它会说INSERT语句的语法有错误,但我一辈子都找不到它 我正在使用另一个名为RunSQL的函数运行SQL语句,如果需要,我可以提交该函数,但它与我使用它运行的所有其他SQL语句都可以正常工作 Users表具有以下列及其数据类型 用户ID-自动编号(主键) 用户名-短文本 密码-短文本 我已尝试在要插入到表中的值周围添加“”,以及删除&并使其成为一个连续字符串。我已尝试添加/删除;但一切都没有奏效 Dim sql A

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

当我试图运行代码时,它会说INSERT语句的语法有错误,但我一辈子都找不到它

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

Users表具有以下列及其数据类型 用户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
代码应该从username和password文本框中获取值,并将它们插入Users表,但到目前为止,它只返回了一个SQL错误

试试这个(可能是因为缺少引号,也可能是因为密码是受保护的字):

还要注意sql注入问题。 如果用户将引号放入文本框中,则插入仍将失败

您应该尝试将代码转换为参数化查询,例如:


这是使用参数的一种方法。使用参数是非常重要的,因为否则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语句中的显示顺序相匹配。

学习使用参数。不要用文字值来修饰查询字符串。我不明白你的意思。请你详细说明一下,我试过了,但还是有语法错误。我用来运行查询的过程可能有问题吗?我会把它添加到原始帖子中你想插入的用户名和密码是什么?在使用Messagebox执行查询之前,是否可以显示插入。show方法?现在应该在文章中。谢谢。查询看起来很好,您能同时显示表定义吗?(最好是脚本)也尝试将密码更改为[密码],密码是保留字。看看这篇文章,我已经更新了查询。@VladimirDC我很高兴它起作用了。请点击答案左侧的复选标记(勾号)接受我的答案。
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