如何比较VB ListView中的数据和MySQL数据库中的数据?

时间:2014-05-19 05:54:59

标签: mysql vb.net listview

我想要做的是,我想比较来自String ListView的{​​{1}}值,并查看该产品是否已存在。如果是,那么它应该只更新数量,否则它应该作为新产品添加。当list.SubItems(2).Text上只有一个项目时,它可以正常工作,如果有两个(或更多)错误发生ListView,如果我删除"Reader is closed..."我会收到错误说{ {1}}请帮助!

reader.Close()

2 个答案:

答案 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