我试图添加和更新数据库我的代码的添加部分工作正常,但更新给我一个错误说无效的列名称

时间:2013-04-15 20:19:25

标签: vb.net

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

3 个答案:

答案 0 :(得分:2)

可能错误出现在您查询的这一部分

 SET product_name=" & Me.Txtproductname.Text &

它没有用单引号括起来。

但是我要说这种插入或更新的方式确实是错误的。

  • 首先,如果您的任何文本字段包含单引号,则会获得 语法错误
  • 其次,您将代码暴露给用户编写的任何恶意文本 See 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))

答案 1 :(得分:0)

您在更新'后忘记了单引号product_name

答案 2 :(得分:0)

可能听起来很愚蠢,但是没有指定无效的列名吗?

在SET和Where子句中,您是否需要围绕product_name值的单个抽搐?