-3
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
4

3 回答 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_inprice
如果这些字段不是文本类型,那么您应该添加一个转换

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 回答