从ListVIEW更新记录到数据库

时间:2015-01-15 23:17:34

标签: database vb.net

数据库表:tblsale

字段:id [autonumber], name[text], TOTALQTY [text], TOTALPRICE[text]

lvlist列:QTY, NAME, PRICE

这是我的代码

sql = "UPDATE tblsale set TOTALQTY = TOTALQTY + lvlist.FocusedItem.getTOTALQTY AND TOTALPRICE = TOTALPRICE + lvlist.FocusedItem.SubItems(2).getTOTALPRICE where name = '" & lvlist.FocusedItem.SubItems(1)

Dim acscmd = New OleDb.OleDbCommand(sql, Con)
acsdr = acscmd.ExecuteReader()

我收到的错误是

  

[查询表达式'name ='Focaccia Bread'中字符串中的SYNTAX ERROR。]

我正在尝试从lvlist记录更新tblsale中的记录,我也希望从新的QTY添加以前的QTY,同样适用于PRICE

1 个答案:

答案 0 :(得分:1)

您的命令文本中存在很多问题。

首先您需要查看UPDATE命令的正确语法。两个字段之间的AND是错误的,你需要一个逗号。

第二次您无法将lvList.FocusedItem....放入命令文本中。以这种方式,它成为一个文字字符串,并不代表要插入的值。

最后,参数化查询总是可行的方式,使用Sql Injection更难以利用Access,因为它不支持SQL Server或MySQL之类的批处理语句,但是,参数化方法还有其他优点。例如,您不需要引用字符串或数字,并且避免忘记在命令结束时关闭引号。

if lvList.FocusedItem IsNot Nothing Then

    Dim qty = Convert.ToDecimal(lvList.FocusedItem.SubItems(0).Text)
    Dim price = Convert.ToDecimal(lvList.FocusedItem.SubItems(2).Text)
    Dim name =  lvlist.FocusedItem.SubItems(1).ToString()

    sql = "UPDATE tblsale set TOTALQTY = TOTALQTY + @qty, " & _
           "TOTALPRICE = TOTALPRICE + @price " & _  
           "where name = @name"

    Dim acscmd = New OleDb.OleDbCommand(sql, Con)
    acscmd.Parameters.AddWithValue("@qty", qty)
    acscmd.Parameters.AddWithValue("@price", price)
    acscmd.Parameters.AddWithValue("@name", name)
    Dim rowsChanged = acscmd.ExecuteNonQuery()
End If

顺便说一下,FocusedItem并不代表SelectedItem。 ListView在表单上显示时可能有一个FocusedItem,但在用户选择一个特定元素之前没有SelectedItem(此时FocusedItem和SelectedItem是相同的)