我在INSERT INTO语句中有错误

时间:2012-11-21 11:22:31

标签: vb.net winforms ms-access insert

这是我的代码:

Imports System.Data
Imports System.Data.OleDb

Public Class frmAdd
Dim con As New OleDbConnection
Dim com As New OleDbCommand
Dim ins As New OleDbCommand
Dim upd As New OleDbCommand
Dim strcon = ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = Supplies.mdb")

Private Sub frmAdd_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    con.ConnectionString = strcon
    con.Open()
End Sub

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
    ins.CommandText = "INSERT INTO [product info] ([Product Name:],[Description:],[Quantity:],[Type:],[Date Received:],[Barcode:],[Price:]) VALUES ('" & txtItemName.Text & "', '" & txtDescription.Text & "', " & txtItemCount.Text & ", '" & cmbItemType.Text & "', " & txtDate.Text & ", '" & txtBarcode.Text & "', '" & txtPrice.Text & "',);"
    ins.Parameters.AddWithValue("@name", txtItemName.Text)
    ins.Parameters.AddWithValue("@desc", txtDescription.Text)
    ins.Parameters.AddWithValue("@count", Convert.ToInt32(txtItemCount.Text))
    ins.Parameters.AddWithValue("@type", cmbItemType.Text)
    ins.Parameters.AddWithValue("@dt", Convert.ToDateTime(txtDate.Text))
    ins.Parameters.AddWithValue("@code", txtBarcode.Text)
    ins.Parameters.AddWithValue("@price", txtPrice.Text)

    ins.CommandType = CommandType.Text
    ins.Connection = con
    ins.ExecuteNonQuery()
    ins.Dispose()

    con.Close()

在我填满所有文本框后,我点击了保存按钮,当我点击保存按钮时出现错误“INSERT INTO语句中的语法错误。”

4 个答案:

答案 0 :(得分:1)

您的插入代码:

  ins.CommandText = "INSERT INTO product info (Product Name:,Description:,Quantity:,Type:,Date Received:,Barcode:,Price:) VALUES (" & txtItemName.Text & ", '" & txtDescription.Text & ", " & txtItemCount.Text & ", " & cmbItemType.Text & ", " & txtDate.Text & ", " & txtBarcode.Text & ", " & txtPrice.Text & ",);"

列之间有“:”。不知道这是否是故意的。

另外,你的insert into语句是错误的。它应该是这样的:

INSERT INTO ProductInfo(ProductName, Description, Quantity,.....etc)

如果表有空格,不确定如何处理表,即产品信息,也许请使用[产品信息]

最后确保从控件中获取值时,insert into语句中没有非法字符。

也许考虑使用SP并对值进行参数化或对输入进行消毒。

只是一个想法。

答案 1 :(得分:1)

ins.CommandText = "INSERT INTO product info (Product Name:,Description:,Quantity:,Type:,Date Received:,Barcode:,Price:) VALUES (" & txtItemName.Text & ", '" & txtDescription.Text & ", " & txtItemCount.Text & ", " & cmbItemType.Text & ", " & txtDate.Text & ", " & txtBarcode.Text & ", " & txtPrice.Text & ",);"

请更正声明,即您的查询中还有一个额外的撇号(')。 只是删除那个撇号。我想我会工作正常

答案 2 :(得分:1)

具有以下内容:每个列名后,随时在评论中解释。我的猜测是错了......

" & txtItemName.Text & "需要封装在'因为它是文本。

" & cmbItemType.Text & "需要封装在'因为它是文本。

" & txtDate.Text & "需要转换为日期。

" & txtBarcode.Text & "需要加入'因为它是文本。

",);"需要删除最后一个逗号。

我不完全确定您可以在表名和列名中添加空格,随时可以对此人发表评论。

然而,我的猜测是这是某种学校任务,因为这个查询的错误比正确的更多......

答案 3 :(得分:1)

带空格的表名应括在方括号中(产品信息名称中有空格),列名(产品名称,收到日期)也是如此。
然后,如果你的所有列名都有:,那么在方括号的任何地方使用,否则从sql文本(以及数据库字段)中删除:

ins.CommandText = "INSERT INTO [product info] ([Product Name:], [Description:], " + 
                 "[Quantity:],[Type:],[Date Received:],[Barcode:],[Price:]) " + 
                 "VALUES (?,?,?,?,?,?,?)"

说,永远不要使用字符串连接来构建一个sql文本来传递给数据库引擎 您可以避免日期和文本解析的问题(例如,如果您的某个输入文本包含引号,一切都会失败),而且您 avoid Sql Injection Attacks

ins.Parameters.AddWithValue("@name", txtItemName.Text)
ins.Parameters.AddWithValue("@desc", txtDescription.Text)
ins.Parameters.AddWithValue("@count", Convert.ToInt32(txtItemCount.Text))
ins.Parameters.AddWithValue("@type", cmbItemType.Text)
ins.Parameters.AddWithValue("@dt", Convert.ToDateTime(txtDate.Text)
ins.Parameters.AddWithValue("@code", txtBarcode.Text)
ins.Parameters.AddWithValue("@price", Convert.ToDecimal(txtPrice.Text)

我假设数量是数字列,收到日期是DateTime列,价格是数字列。