我需要遍历gridview来查找与不同表中的项匹配的记录(在SQL中)。是循环gridview并在每个循环上调用SQL过程以查找匹配记录的最佳方法吗?或者我应该将整个sql db拉入数据表并在gridview循环中查询数据集吗?
'find source ID based on make/model/serial No combination.
Dim cSource As New clsSource()
Dim ds As DataSet = cSource.GetSources()
Dim found As Boolean = False
'populate db datatables
Dim dt As DataTable = ds.Tables(0)
Dim rows As Integer = gwResults.Rows.Count()
For Each row As GridViewRow In gwResults.Rows
'move through rows and check data in each row against the dataset
'1 - make
For Each dataRow As DataRow In dt.Rows
found = False
If dataRow("manufacturerName") = row.Cells(1).Text Then
If dataRow("modelName") = row.Cells(2).Text Then
If dataRow("serialNo") = row.Cells(3).Text Then
found = True
End If
End If
End If
'display results
If found Then
lblResults.Text += row.Cells(1).Text & "/" & row.Cells(2).Text & "/" & row.Cells(3).Text & " found"
Else
lblResults.Text += row.Cells(1).Text & "/" & row.Cells(2).Text & "/" & row.Cells(3).Text & " not found "
End If
Next
Next
答案 0 :(得分:1)
我认为你需要定义“更好”。
如果你需要优化内存 - 那么循环和查询。哦,但如果您正在为现代硬件编写代码,那么在此级别优化内存通常不是一个好主意(尽管如果您的网格有数十或数十万或行,可能不是这样)。
如果需要优化时间,请运行单个查询,并在内存中循环。
答案 1 :(得分:0)
gridview中的数据来自哪里?你应该做的是一个SQL连接。如果那是不可能的,例如gridview数据来自完全不同的源,对SQL结果集执行单个交错循环要快得多。这假设有许多不同的值需要匹配,并且从gridview中直接执行该任务的数据构建SQL select是不切实际的。
1)从SqlDataReader
,manufacturername
,modelName
serialNo
2)以相同的方式订购gridview
3)从每个的第一个记录开始,在循环中,将gridview中的当前值与数据读取器中的当前值进行比较。如果它们小于(之前)数据读取器中的当前数据,则向前移动网格视图指针。如果它们大于,则向前移动数据读取器指针。如果它们相等,则采取您需要的操作,并且(如果您想继续)将gridview指针向前移动。继续,直到到达网格视图的末尾,数据阅读器中的最后一条记录大于网格视图中的最后一条记录。
这最大迭代次数等于两个集合中的较大者和单个数据库查询。