数据库表: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
答案 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是相同的)