Private Sub Btnadd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btnadd.Click
Dim cmd As New SqlCommand
If Not cnn.State = ConnectionState.Open Then
'open connection if it is not yet open
cnn.Open()
End If
cmd.Connection = cnn
'check whether add new or update
If Me.Txtproductname.Tag & "" = "" Then
'add new
'add data to table
cmd.CommandText = "INSERT INTO stock(product_name, product_id, unit,price, item_type, date_in) " & _
" VALUES('" & Me.Txtproductname.Text & "','" & Me.Txtproductid.Text & "','" & _
Me.txtunit.Text & "','" & Me.txtprice.Text & "','" & _
Me.Txtitem_type.Text & "','" & Me.txtdate_in.Text & "')"
cmd.ExecuteNonQuery()
Else
'update data in table
cmd.CommandText = "UPDATE stock " & _
" SET product_name=" & Me.Txtproductname.Text & _
", product_id='" & Me.Txtproductid.Text & "'" & _
", unit='" & Me.txtunit.Text & "'" & _
", price='" & Me.txtprice.Text & "'" & _
", item_type='" & Me.Txtitem_type.Text & "'" & _
", date_in='" & Me.txtdate_in.Text & "'" & _
" WHERE product_name=" & Me.Txtproductname.Tag
cmd.ExecuteNonQuery()
End If
'refresh data in list
RefreshData()
'clear form
Me.Btnclear.PerformClick()
'close connection
cnn.Close()
End Sub
问问题
92 次
3 回答
2
错误可能在您查询的这一部分
SET product_name=" & Me.Txtproductname.Text &
它没有用单引号括起来。
但是让我说,这种插入或更新的方式确实是错误的。
- 首先,如果您的任何文本字段包含单引号,则会出现语法错误
- 其次,您将代码暴露给用户编写的任何恶意文本 参见 Sql Injection
处理更新或插入的正确方法是通过参数化查询。
例如,这可以用于更新
cmd.CommandText = "UPDATE stock " & _
" SET product_name=@prodName " & _
", product_id=@prodID" & _
", unit=@unit" & _
", price=@price" & _
", item_type=@itemType" & _
", date_in=@date" & _
" WHERE product_name=@prodTag"
cmd.Parameters.AddWithValue("@prodName", Me.Txtproductname.Text)
cmd.Parameters.AddWithValue("@prodID", Me.Txtproductid.Text)
cmd.Parameters.AddWithValue("@unit", Me.txtunit.Text)
cmd.Parameters.AddWithValue("@price", Me.txtprice.Text)
cmd.Parameters.AddWithValue("@itemType", Me.Txtitem_type.Text)
cmd.Parameters.AddWithValue("@date", Me.txtdate_in.Text)
cmd.Parameters.AddWithValue("@prodTag", Me.Txtproductname.Tag)
cmd.ExecuteNonQuery()
通过这种方式,您可以让框架代码处理文本框的正确解析,并防止将意外命令传递到数据库的任何可能性。
除此之外,我想询问您的数据库字段是否真的都是字符串类型。
有些字段似乎是不同类型的,例如date_in
和price
。
如果这些字段不是文本类型,那么您应该添加一个转换
cmd.Parameters.AddWithValue("@date", Convert.ToDateTime(Me.txtdate_in.Text))
于 2013-04-15T20:24:31.380 回答
0
您在更新'
后忘记了单引号。product_name
于 2013-04-15T20:24:47.190 回答
0
听起来可能很愚蠢,但它没有指定无效的列名吗?
您是否需要在 SET 和 Where 子句中围绕 product_name 的值进行单个抽动?
于 2013-04-15T20:27:28.533 回答