如何在DataSet中查找记录?

时间:2016-01-13 12:09:22

标签: .net vb.net dataset

我正在尝试在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或其他方法可以用来避免这种情况。

1 个答案:

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