从 ListVIEW 到数据库更新记录

Update Records from ListVIEW TO Database

数据库 table : 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()

我收到的错误是

[SYNTAX ERROR in string in query expression 'name = 'Focaccia Bread'.]

我正在尝试从 lvlist 记录更新 tblsale 中的记录,我还想从新的记录中添加以前的数量,价格也是如此

你的命令文本中有很多问题。

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

其次 你不能把 lvList.FocusedItem.... 放在命令的文本中。这样它就变成了一个文字字符串,并不代表要插入的值。

最后,参数化查询总是要走的路,Access 更难利用 Sql 注入,因为它不支持像 SQL服务器或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 相同)