我正在尝试在Dataset
中找到特定记录,这是由查询结果填充的,例如:
Dim ds As New DataSet
Dim query = "SELECT * FROM tax ORDER BY id"
MyAdapter = New MySqlDataAdapter(query, my connection string here)
MyAdapter.Fill(ds)
现在我有另一个Dataset
,其中包含同一个表的内容但是另一个数据库的内容。我正在尝试获取字段hash
,这允许我比较此hash
行的所有字段。实际上我所做的是创建一个这样的循环:
If ds.Tables(0).Rows.Count > 0 Then
Dim x As Integer = 0
For x = 0 To ds.Tables(0).Rows.Count - 1
Dim local_hash = ds.Tables(0).Rows(x).Item("hash")
Dim web_hash = ds2.Tables(0).Rows(x).Item("hash") 'This is another dataset as I explained in the comment above.
If local_hash = web_hash 'compare if the hash is equal
现在这个代码不能用于显而易见的原因,两个数据库的索引在循环中是不同的,然后我永远不会找到引用数据集上循环索引的hash
字段。所以我想问一下,如果有.Find
或其他方法可以用来避免这种情况。
答案 0 :(得分:0)
您可以从DataTable
中选择以获取符合条件的行数组:
Dim dtLocal = ds.Tables(0)
Dim dtWeb = ds2.Tables(0)
Dim local_hash As String '??
Dim search As String = "Hash = '{0}'"
For n = 0 To dtLocal.Rows.Count-1
local_hash = dtLocal.Rows(n).Item("hash").ToString
' get matching rows
Dim webRows = dtWeb.Select(String.Format(search, local_hash))
'iterate matches
For Each r As DataRow In webRows
' do wonderful things
Next
Next
您可能必须使用搜索字符串格式,因为不清楚哈希是什么。听起来像是字符串。
另一种方法是使用DataView
或另一种方法是使用一个DataTable
作为“主”并使用当前行的“哈希”重建另一个作为SQL WHERE子句。评论中的DataView版本如下所示:
Dim dvW As New DataView(dtWeb, "", "hash", DataViewRowState.CurrentRows)
For n = 0 To dtLocal.Rows.Count - 1
local_hash = dtLocal.Rows(n).Item("hash").ToString
' get matching rows
Dim webRows = dvW.FindRows(local_hash)
' iterate matches
' possibly panic if more than one row
For Each dvr As DataRowView In webRows
' do wonderful things
Next
Next
如果您使用Find
而不是FindRows
,则会返回该行的索引。 FindRows会捕获其他问题,例如不止一次使用的Guid / hash。
使用400多个“主”行和4000多个“详细”行,并且只是迭代主数据以收集详细信息ID,每个花费大约相同的时间:DataTable.Select
与376重新创建使用DataView.FindRows
表完全对比253。