从 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 相同)
数据库 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 相同)