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

Mysql 比较数据表/识别相同的数据表,mysql,.net,vb.net,Mysql,.net,Vb.net,我正在使用VB.net和mysql,我有一个函数,用mysql内容填充datatable,然后将其(视情况而定)发布到listview。这个功能目前在一个计时器上,每5秒激活一次,不幸的是,这对我的软件的拖放功能造成了可怕的破坏 解决方案:在将内容填充到listview后,我决定将内容从活动datatable复制到另一个datatable进行比较,每次从mysql数据库获取数据时,将其保存到datatable并比较两个datatable-如果它们不相同,软件应运行该功能,但是如果它们相同,则没有

我正在使用VB.net和mysql,我有一个函数,用mysql内容填充datatable,然后将其(视情况而定)发布到listview。这个功能目前在一个计时器上,每5秒激活一次,不幸的是,这对我的软件的拖放功能造成了可怕的破坏

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

    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
Public作为新数据表运行
公共postrun作为新数据表
私有子Timer1\u Tick(发送方作为对象,e作为事件参数)处理Timer1.Tick
con.ConnectionString=“服务器=本地主机;”_
&“用户id=用户;”_
&“密码=密码;”_
&“数据库=DMT”
adptr=新的MySqlDataAdapter(“从数据中选择*”,con)
尝试
自动进料(待运行)
捕获错误作为异常
Dim strError As String=“异常:&err.ToString()”
结束尝试
如果运行postrun,则
ListView2.Items.Clear()
pendrun.Clear()
'要添加的命令
'运行数据表信息
'到listview
postrun=pendrun'将数据传输到保留数据表
如果结束
问题是

if pendrun <> postrun then
如果pendrun postrun那么
不是比较数据表的有效方法。
如何识别数据表是否相同(所有行和列都相同)

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

本质上,您需要构建一个函数,该函数接受两个
DataTable
s作为输入,根据您定义的任何业务逻辑对它们进行比较,并返回一个
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

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


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

更好的是,如果没有更改,为什么不输入逻辑以不获取新数据。
不知道MySQL,但MSSQL有通知和时间戳

列应仅随架构更改而更改。
首先比较计数,如果不相同,确定是否有变化。
如果计数相同,则循环各列并进行比较。
一不比较就马上做回假

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

正确,代码比您的答案中的代码少
我的插页是C#


下面是我为解决这个问题而创建的代码——感谢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

效率太低了。如果第一行和第一列不匹配,为什么要构建每一行和每一列?字符串是不可变的-db1=db1&效率非常低。为什么不按照我在回答中的建议,从测试行数开始呢。如果没有排序,您可以有相同的行,但顺序不同。如果你打算把整个事情写出来,那么为什么不按照Milani的建议使用WriteXml呢?正如我所说的,我是从mysql数据库中提取的-在我的情况下,我使用的是order命令,因此事实上,如果订单发生变化,这将是一件大事,值得更新listview-任何需要解决的变化-我是在扔代码,根据我已经知道的方法,为了找到一个适用于我的应用程序的解决方案,我宁愿构建我的整个字符串,在我的场景中,它永远不会超过大约2500个字符,也不愿添加搜索每一行的附加过程,此外,我开发了我的解决方案,没有连接互联网-从来没有看到你的帖子搜索每一行的附加过程是什么?您现在拥有的代码可以访问每一列和每一行。您现在拥有的代码将进行权益比较。你可以用比现在更少的代码行来完成这项工作。在你的问题陈述中没有分类。
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