这是我的代码:
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语句中的语法错误。”
答案 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列,价格是数字列。