我正在使用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
不是比较数据表的有效方法。 如何识别数据表是否相同(所有行和列相同)
答案 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