比较数据表/识别相同的数据表

时间:2013-12-30 15:48:07

标签: mysql .net vb.net

我正在使用VB.net和mysql,我有一个函数用mysql内容填充数据表然后将其(如果适用)发布到listview。此功能目前在一个计时器上,每5秒激活一次,不幸的是,我的软件的拖放功能遭受了可怕的破坏。

解决方案:我已经决定在将内容填充到listview之后将内容从活动数据表复制到另一个数据表进行比较,每次从mysql数据库获取数据时都将其保存到数据表并比较两者数据表 - 如果它们不相同,则软件应运行该函数,但如果它们相同,则没有理由使用相同的确切数据更新列表视图。

    Public pendrun As New DataTable
    Public postrun As New DataTable

   Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        con.ConnectionString = "server=localhost;" _
& "user id=user;" _
& "password=password;" _
& "database=DMT"
    adptr = New MySqlDataAdapter("Select * from data", con)
    Try
        adptr.Fill(pendrun)
    Catch err As Exception
        Dim strError As String = "Exception: & err.ToString()"
    End Try
if pendrun <> postrun then
    ListView2.Items.Clear()
    pendrun.Clear()

' commands to add
' pendrun datatable information
' to listview

postrun = pendrun 'to transfer data to the holding datatable

end if

问题是

if pendrun <> postrun then

不是比较数据表的有效方法。 如何识别数据表是否相同(所有行和列相同)

4 个答案:

答案 0 :(得分:1)

对于您定义的类型,没有内置的“相同”理解。你需要写出那个逻辑。

基本上你需要构建一个接受两个DataTable作为输入的函数,根据你定义的业务逻辑对它们进行比较,然后返回一个Boolean来表明它们是否通过了那个逻辑。像这样:

Function TablesAreEqual(ByVal firstTable As DataTable, ByVal secondTable As DataTable) As Boolean 
    ' Compare your tables, probably by looping through rows/values
    Return areEqual
End Function

然后你在比较中使用该功能:

If TablesAreEqual(pendrun, postrun) Then

答案 1 :(得分:0)

如果您想使用pendrun和postrun数据表 尝试序列化“writeXml”数据表并进行比较。

无论如何,我建议你考虑一种不同的方法,而不是使用轮询计时器。

答案 2 :(得分:0)

更好的是,如果没有改变,为什么不在逻辑上不获取新数据 不了解MySQL,但MSSQL有Notification和TimeStamp

列只应随架构更改而改变 首先比较计数,如果不相同,肯定会有变化 如果计数相同,则循环遍历列并进行比较 只要一个不比较,那么立即返回false。

在行上同样的事情。第一次测试行计数 之后需要逐行和逐列比较 请记住对select语句进行排序,以便不按顺序捕获行 只要一个人不比较停止并返回假。

正确的代码少于答案中的代码
我的插入是C#

Function TablesAreEqual(ByVal firstTable As DataTable, ByVal secondTable As DataTable) As Boolean
    if(firstTable.Rows.Count != secondTable.Rows.Count) return false;
    if(firstTable.Columns.Count != secondTable.Columns.Count) return false;
    For rown As Integer = 0 To firstTable.Rows.Count - 1
        For cown As Integer = 0 To firstTable.Columns.Count - 1
            if (firstTable.Rows(rown).Item(cown) != secondTable.Rows(rown).Item(cown)) return false;
        Next
    Next
    return true;   
 End Function

答案 3 :(得分:0)

以下是我为处理此问题而创建的结果代码 - 感谢David的指示

Function TablesAreEqual(ByVal firstTable As DataTable, ByVal secondTable As DataTable) As Boolean
dim db1 As String = ""
dim db2 As String = ""
    For rown As Integer = 0 To firstTable.Rows.Count - 1
        For cown As Integer = 0 To firstTable.Columns.Count - 1
            db1 = db1 & firstTable.Rows(rown).Item(cown)
        Next
    Next
    For rown As Integer = 0 To secondTable.Rows.Count - 1
        For cown As Integer = 0 To secondTable.Columns.Count - 1
            db2 = db2 & secondTable.Rows(rown).Item(cown)
        Next
    Next
    Return db1 = db2

 End Function