[英]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"
第三个选项是告诉命令生成器转义每个列名,允许您继续在查询中使用通配符。 您可以通过设置QuotePrefix
和QuoteSuffix
属性来完成此操作。 从上面的 SQL 示例中可以看出,前缀是左括号,后缀是右括号。 其他一些数据库可能使用不同的字符,例如 MySQL 对两者都使用一个坟墓。 例如
With cb
.QuotePrefix = "["
.QuoteSuffix = "]"
End With
您只需为每个命令生成器执行一次,并且必须在对数据适配器调用Update
之前执行此操作。 最明智的选择是在创建命令生成器的地方进行,例如
Dim cb As New OleDbCommandBuilder(da) With {.QuotePrefix = "[",
.QuoteSuffix = "]"}
您两次访问数据库,一次使用.Fill
方法,一次使用.Update
。 DataAdapters、DataSets、DataTables 和 CommandBuilders 的所有开销都是不必要的。 如果您只想添加一个用户,那么以下步骤将完成此操作。
创建一个将连接字符串传递给构造函数的连接。
创建一个命令,将命令文本和连接传递给构造函数。
创建将参数名称、数据类型和字段大小传递给 .Add 方法的参数并设置值。 我不得不猜测数据类型和字段大小。 查询数据库以获取真实值并相应地调整代码。
打开连接并执行命令。
正如@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.