我想要做的是,我想比较来自String
ListView
的{{1}}值,并查看该产品是否已存在。如果是,那么它应该只更新数量,否则它应该作为新产品添加。当list.SubItems(2).Text
上只有一个项目时,它可以正常工作,如果有两个(或更多)错误发生ListView
,如果我删除"Reader is closed..."
我会收到错误说{ {1}}请帮助!
reader.Close()
答案 0 :(得分:0)
代码中的逻辑没有按照您的预期执行。
首先,一旦找到匹配项,您就会关闭reader
。如果剩余行,则在下一个循环中尝试从reader
读取时会出错,因为您关闭了阅读器。
其次,您总是会插入产品,因为您没有设置标记来指示产品是否在While循环中找到。
第三,您多次读取同一组数据(对于ListView
中的每个项目)。这是昂贵且不必要的。
第四,我希望数量在你的表中是一个int,并且你试图存储一个字符串,这可能是一个问题(可能不是在MySQL中)。为了安全起见(如果列真的是int)我在发送到数据库之前将字符串转换为int。
更好的方法是从表中一次读取产品列表并将其存储在List<String>
中,然后循环遍历ListView
中的项目列表。如果找到匹配项,则更新数量。如果您找不到匹配项,请插入产品。
Dim productNames As List(Of String) = New List(Of String)
command.CommandText = "SELECT Product_Name FROM tblPRoduct"
command.Connection = connect
Using reader = command.ExecuteReader()
While (reader.Read())
productNames.Add(reader.GetStrign(0))
End While
End Using
For iLoop As Integer = 0 To lvwSI.Items.Count - 1
list = lvwSI.Items.Item(iLoop)
If productNames.Contains(list.SubItems(2).Text) Then
command.CommandText = "UPDATE tblProduct SET Quantity = " & CInt(list.SubItems(0).Text) & " WHERE Product_Name = '" & prodName & "'"
command.ExecuteNonQuery()
Else
command.CommandText = "INSERT INTO tblProduct(Product_Name, Quantity, Unit, Description) VALUES ('" & list.SubItems(2).Text & "', " & CInt(list.SubItems(0).Text) & ", '" & list.SubItems(1).Text & "', '" & list.SubItems(3).Text & "')"
command.ExecuteNonQuery()
End If
Next
已添加
如果要将项目的ListView
中的数量添加到数据库中的数量,只需在SET语句中执行:
SET Quantity = Quantity + " & CInt(list.SubItems(0).Text)
所以完整的命令看起来像这样:
command.CommandText = "UPDATE tblProduct SET Quantity = Quantity + " & CInt(list.SubItems(0).Text) & " WHERE Product_Name = '" & prodName & "'"
答案 1 :(得分:0)
对我来说使用Reader有点冒险,因为当两台客户端计算机同时从服务器查询时,可能会导致两台客户端计算机中的一台无法查询数据&#34;连接已关闭&#34;
我使用此功能来保护所有客户端计算机,而无需关闭数据库。
Public Function getSingleTestParameterData(ByVal sQuery As String) As String
getSingleTestParameterData = Nothing
Try
Dim dataS As DataSet
connectToDB()
CMD = New SqlCommand(sQuery, TestResult)
sqlAdapter = New SqlDataAdapter(CMD)
dataS = New DataSet
sqlAdapter.Fill(dataS, "getSingleData")
getSingleTestParameterData = dataS.Tables("getSingleData").Rows(0).ItemArray(0).ToString
Catch ex As Exception
End Try
End Function