1

我认为我的 Insert into/ 语法是正确的,但是当我运行项目时总是出现错误...在此代码中,我正在尝试使用 vb2012 将数据添加到我的数据库 ms access 2013 这里的代码...

Private Sub btnadd_Click(sender As Object, e As EventArgs) Handles btnadd.Click

    provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    dataFile = "C:\Users\hp-2\Documents\Visual Studio 2012\Projects\Delta\Delta.mdb"

    connString = provider & dataFile
    cnn.ConnectionString = connString
    cnn.Open()

    cmd.Connection = cnn
    addstring = "insert into Transaction (Customer_Name, Job, Trans_date, Amount ) values (" & C_name.Text & ",'" & C_job.Text.Length & "','" & t_date.Text & "','" & t_amount.Text & "');"
    cmd = New OleDbCommand(addstring, cnn)
    cmd.ExecuteNonQuery()
    cnn.Close()
End Sub

这是错误...

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Additional information: Syntax error in INSERT INTO statement.
4

3 回答 3

0

虽然将单引号放在 Name ('" & C_name.Text & "') 中很重要,但猜测您的金额不是 varchar 列,因此您可能可以为该字段取消单引号。

调试此问题的最佳方法是观察生成的插入命令(字符串值)并检查与您的表设计相比是否存在任何语法错误。

于 2013-08-12T08:13:45.970 回答
0

我认为如果问题是由于VALUES子句中的不正确引用引起的,你会得到一个不同的错误,要么是“标准表达式中的数据类型不匹配”,要么是数据库引擎需要一个参数值但你没有提供的消息。

我的猜测是语法错误是由于这Transaction是一个保留字。当您将表名括在方括号中时,请查看它是否有效。

insert into [Transaction] (Customer_Name, Job,  ... 

如果该更改消除了错误,我认为您不应止步于此。正如其他人所建议的那样,切换到参数查询,而不是将值构建到字符串中并执行字符串。除了防止 SQL 注入错误之外,参数查询还可以避免VALUES子句中的引号引起的复杂性。如果您遵循该建议,您仍然应该使用括号[Transaction]。更好的是,如果可能,将表名更改为非保留字。

于 2013-08-12T12:36:46.743 回答
0

customer_name 不在报价单中。你也在传递.Length,我认为这不是你想要做的。

最重要的是,您应该将所有内容都放入参数中。

addstring = "insert into Transaction (Customer_Name, Job, Trans_date, Amount ) values (@Customer_Name, @Job, @Trans_date, @Amount);"

cmd = New OleDbCommand(addstring, cnn)

cmd.Parameters.AddWithValue("@Customer_Name", C_name.Text)
cmd.Parameters.AddWithValue("@Job", C_job.Text)
cmd.Parameters.AddWithValue("@Trans_date", Convert.ToDateTime(t_date.Text))
cmd.Parameters.AddWithValue("@Amount", Convert.ToInt32(t_amount.Text))
于 2013-08-12T13:37:23.853 回答