以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  醉了,5000条数据处理20分钟  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=87681)

--  作者:xujie80
--  发布时间:2016/7/16 22:10:00
--  醉了,5000条数据处理20分钟

Select Case e.DataCol.name
    Case "身份证号","户主姓名","粮食直补面积","粮食直补标准","粮食直补金额","农资补贴面积","农资补贴标准","农资补贴金额"
        Dim dr As DataRow = e.DataRow
        Dim pr As DataRow
        If dr.IsNull("身份证号") Then
        Else
            Dim filter As String
            filter = "身份证号 = \'" & dr("身份证号") & "\'"
            pr = DataTables("员工资料").Find(filter)
            If pr IsNot Nothing Then
                pr("姓名") = dr("户主姓名")
                pr("户主关系") = "户主"
            End If
        End If
End Select

 

从当前表复制“姓名”和“户主关系”到“员工资料表”,当前表5000多行,“员工资料”表80000多行,处理要20分钟,肯定是方法问题,求大神指点。


--  作者:李睿涵
--  发布时间:2016/7/17 6:03:00
--  
http://www.foxtable.com/webhelp/index.htm?page=2225.htm
--  作者:xujie80
--  发布时间:2016/7/17 7:32:00
--  
不知道跨表有没有影响?正在试验中
--  作者:blackzhu
--  发布时间:2016/7/17 9:02:00
--  
一次性处理5000行,用表事件当然慢,你还不如用按钮处理.
--  作者:kylin
--  发布时间:2016/7/17 10:53:00
--  
Select Case e.DataCol.name
    Case "身份证号","户主姓名"
        Dim dr As DataRow = e.DataRow
        Dim pr As DataRow
        If dr.IsNull("身份证号") Then
        Else
            Dim filter As String
            filter = "身份证号 = \'" & dr("身份证号") & "\'"
            pr = DataTables("员工资料").Find(filter)
            If pr IsNot Nothing Then
                pr("姓名") = dr("户主姓名")
                pr("户主关系") = "户主"
            End If
        End If
End Select

删减无关的字段,再测试一下


--  作者:cbt
--  发布时间:2016/7/17 11:02:00
--  
 用字典做 键值对,瞬间完成!

--  作者:xujie80
--  发布时间:2016/7/17 13:18:00
--  
@cbt: 能不能麻烦老兄告知一下数据字典应该如何操作?
--  作者:cbt
--  发布时间:2016/7/17 17:37:00
--  
DataTables("表A").DataRows.Clear
DataTables("表A").StopRedraw()
For i As Integer = 0 To 5000
    Dim dr As DataRow = DataTables("表A").AddNew
    dr("第一列")= "aa" & i
    dr("第二列")= "bb1" & i
Next
DataTables("表A").ResumeRedraw()

DataTables("表B").DataRows.Clear
DataTables("表B").StopRedraw()
For i As Integer = 0 To 80000
    Dim dr As DataRow = DataTables("表B").AddNew
    dr("第一列")= "aa" & i
    dr("第二列")= "bb1" & i
Next
DataTables("表B").ResumeRedraw()
MessageBox.show("模拟数据完成")

Dim zd1 As new Dictionary(of String,DataRow)
Dim zd2 As new Dictionary(of String,DataRow)
For Each  dr As DataRow In DataTables("表A").DataRows
    zd1.Add(dr("第一列"),dr)
Next
For Each  dr As DataRow In DataTables("表B").DataRows
    zd2.Add(dr("第一列"),dr)
Next

For Each str As String In zd1.Keys
    If zd2.ContainsKey(str) Then
        zd2(str)("第三列")= zd1(str)("第二列") \'赋值
    End If
Next

MessageBox.show("数据复制完成")
--  作者:xujie80
--  发布时间:2016/7/18 11:10:00
--  
高手如云,学习了,谢谢
--  作者:大红袍
--  发布时间:2016/7/19 1:13:00
--  

Case "身份证号","户主姓名","粮食直补面积","粮食直补标准","粮食直补金额","农资补贴面积","农资补贴标准","农资补贴金额"

 

改成

 

Case "身份证号"

 

而且,你要确保,你datacolchanged事件没有其他代码会影响。