sql - 关于 SQL 语句的语法,我错过了什么?

标签 sql vb.net insert syntax-error

我正在编写代码以将用户名和密码插入到名为 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 错误。

This is what the SQL statement looks when with "bh106" being the Username and "ZLTga" being the Password

最佳答案

这是使用参数的一种方式。使用参数非常重要,否则您将面临 SQL 注入(inject)的风险,这可能会破坏您的数据库。实际上,以这种方式编写 SQL 语句要容易得多,因为您不必担心字符串中的所有引号是否正确。
Using...End Using block 确保即使出现错误,您的数据库对象也已关闭和处置。这很重要,因为它会释放所有正在使用的非托管资源。

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

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 语句中出现的顺序相匹配。

关于sql - 关于 SQL 语句的语法,我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54480676/

相关文章:

java - 使用什么作为 SQL 数据库日期的主键

c# - 如何使用 EF Core 更改 Sqlite 数据库?

Python pandas 将行插入 DF 并将缺失值作为 Nan 的快速方法

java - 尝试在 Java 中构建

mysql - 使用 "is not null"的左连接查询的优化

sql - Oracle优化器会在同一SELECT中使用多个提示吗?

mysql - SQL 在连接表上使用条件 AND 以确保至少匹配两个或多个值

vb.net - 如何在 Visual Basic 中将 Mat 和标量与 EmguCV 相乘?

WPF 和 MVVM : Any examples using VB. 网络?

php - 大型 mysql 插入语句