0

这是我的代码:

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

4 回答 4

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 并将值参数化或清理输入。

只是一个想法。

于 2012-11-21T11:29:03.697 回答
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 & ",);"

请更正您的陈述,即您的查询中有一个额外的撇号 (')。只需删除那个撇号。我想我会工作得很好

于 2012-11-21T11:30:12.537 回答
1

Whats with the : 在每列名称之后,请随时在评论中解释。我的猜测是它是错误的......

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

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

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

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

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

我不完全确定您可以在表名和/或列名中包含空格,请随时对此发表评论。

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

于 2012-11-21T11:36:00.683 回答
1

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

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

就是说,永远不要使用字符串连接来构建 sql 文本以传递给数据库引擎。
您避免了日期和文本解析的问题(例如,如果您的输入文本之一包含引号,一切都会失败),此外您还避免了 Sql 注入攻击

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)

我假设Quantity是一个数字列,Date Received是一个 DateTime 列,Price是一个数字列。

于 2012-11-21T11:49:58.253 回答