繁体   English   中英

如何修复 vbnet 中 INSERT INTO 语句中的语法错误?

[英]How do fix Syntax error in INSERT INTO statement in vbnet?

我正在尝试更新我的数据库并遇到此错误。 我正在尝试通过添加新行来更新我的数据库并遇到此错误。

    Dim dsNewRow As DataRow
    Dim ds As New DataSet

    Dim con As New OleDbConnection

    con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\POS DATABASE.mdb"
    con.Open()

    Dim sql As String = "SELECT * FROM manager_login_data"

    Dim da As New OleDbDataAdapter(sql, con)

    Dim cb As New OleDb.OleDbCommandBuilder(da)


    da.Fill(ds, "manager_login_data")

    dsNewRow = ds.Tables("manager_login_data").NewRow()

    dsNewRow.Item("username") = TextBox1.Text
    dsNewRow.Item("password") = TextBox2.Text



    ds.Tables("manager_login_data").Rows.Add(dsNewRow)


    da.Update(ds, "manager_login_data")

我想知道我需要做什么才能解决这个问题并使我的程序运行。 错误发生在 da.Update 行。

编辑:我发现必须更改我提供给 da 的 sql 命令。

我只需要知道什么。

编辑2:

我的访问数据库

您不一定需要更改查询。 几乎可以肯定发生的是,您的列名之一是保留字或包含空格或其他特殊字符。 有多种方法可以解决这个问题。

第一个也是最好的选择是更改您的列名称。 永远不要在列名中使用空格或特殊字符,并且应该避免使用保留字。 这似乎是 Access 中的登录数据,这使得您的列之一很可能被命名为Password 这确实是 Jet SQL 中的保留字。 如果您正确地做事,那么您一开始就不会以明文形式存储密码,而是将它们散列。 在这种情况下,该列可以命名为PasswordHash ,问题就会消失。 如果您无法将列名更改为更合适的名称,则需要尝试其他选项。

另一种选择是不在查询中使用通配符。 如果您这样做,命令构建器将简单地使用列名称,但是,如果您明确指定列,命令构建器将使用与您所做的相同的名称。 在这种情况下,您需要对查询中的任何问题列名称进行转义,然后命令生成器将执行相同的操作,例如

Dim sql As String = "SELECT UserName, [Password] FROM manager_login_data"

第三个选项是告诉命令生成器转义每个列名,允许您继续在查询中使用通配符。 您可以通过设置QuotePrefixQuoteSuffix属性来完成此操作。 从上面的 SQL 示例中可以看出,前缀是左括号,后缀是右括号。 其他一些数据库可能使用不同的字符,例如 MySQL 对两者都使用一个坟墓。 例如

With cb
    .QuotePrefix = "["
    .QuoteSuffix = "]"
End With

您只需为每个命令生成器执行一次,并且必须在对数据适配器调用Update之前执行此操作。 最明智的选择是在创建命令生成器的地方进行,例如

Dim cb As New OleDbCommandBuilder(da) With {.QuotePrefix = "[",
                                            .QuoteSuffix = "]"}

您两次访问数据库,一次使用.Fill方法,一次使用.Update DataAdapters、DataSets、DataTables 和 CommandBuilders 的所有开销都是不必要的。 如果您只想添加一个用户,那么以下步骤将完成此操作。

  1. 创建一个将连接字符串传递给构造函数的连接。

  2. 创建一个命令,将命令文本和连接传递给构造函数。

  3. 创建将参数名称、数据类型和字段大小传递给 .Add 方法的参数并设置值。 我不得不猜测数据类型和字段大小。 查询数据库以获取真实值并相应地调整代码。

  4. 打开连接并执行命令。

正如@jmcilhinney 在他的回答中所指出的那样,我确实在 Sql 语句中用括号转义了密码。

Private Sub InsertNewUser()
    Using con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\POS DATABASE.mdb"),
            cmd As New OleDbCommand("Insert Into manager_login_data (username, [password]) Values (?,?);", con)
        With cmd.Parameters
            .Add("@user", OleDbType.VarChar, 100).Value = TextBox1.Text
            .Add("@password", OleDbType.VarChar, 100).Value = TextBox2.Text
        End With
        con.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

编辑

尝试将DataGridView放在Form ,并在执行InsertNewUser后运行以下代码。

Private Sub FillGrid()
    Dim dt As New DataTable
    Using con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\POS DATABASE.mdb"),
        cmd As New OleDbCommand("Select * From manager_login_data;")
        con.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    DataGridView1.DataSource = dt
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    FillGrid()
End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM