以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助] 导入数据量 过大 卡死  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=69668)

--  作者:logicsun
--  发布时间:2015/6/9 9:26:00
--  [求助] 导入数据量 过大 卡死
我的目的是设计一个功能,能 从外部 excell 导入物料信息 ,table名为 “商品基本信息” ,有四个数据列("厂家","商品编码","品名及规格","商品类别"),导入的excell 格式也调整为和 table 一致  。如下代码,导入 数据行几十行的时候比较正常,想要 一次导入约2万行的时候就会狐表 卡死,设备应该无问题( i5处理器 ,8G 内存)。    求 高手指点 如何改善代码,解决卡死问题?
   以下是代码
Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    Tables("商品基本信息").StopRedraw()
    Dim nms() As String = {"厂家","商品编码","品名及规格","商品类别"}
    For n As Integer = 1 To Sheet.Rows.Count -1
        Dim bh As String = sheet(n,0).Text
        Dim dr As DataRow = DataTables("商品基本信息").Find("品名及规格 = \'" & bh & "\'")
        If dr Is Nothing Then \'如果不存在同编号的订单
            dr =  DataTables("商品基本信息").AddNew()
        End If
        For m As Integer = 0 图片点击可在新窗口打开查看To nms.Length - 1
            dr(nms(m)) = Sheet(n,m).Value
        Next
    Next
    Tables("商品基本信息").ResumeRedraw()
End If


谢谢大家的帮助
出于试验心态,将代码做如下修改(不find,直接导入),结果也是 数据量少的时候正常,导入2万行数据依然卡死,上传了实例,求突破!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:导入合并 实例.zip


Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    
    Dim Book As New XLS.Book(dlg.FileName)
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    Tables("商品基本信息").StopRedraw()
    Dim nms() As String = {"厂家","商品编码","品名及规格","商品类别"}
    For n As Integer = 1 To Sheet.Rows.Count -1
        Dim r As Row = Tables("商品基本信息").AddNew()
        For m As Integer = 0 To nms.Length - 1
            r(nms(m)) = Sheet(n,m).Value
        Next
    Next
    Tables("商品基本信息").ResumeRedraw()
End If
[此贴子已经被作者于2015/6/9 19:12:58编辑过]

--  作者:大红袍
--  发布时间:2015/6/9 9:28:00
--  

 20000行,每一行还要去find,肯定是会卡死的啊,没办法。

 

 耗时在find函数那里。


--  作者:大红袍
--  发布时间:2015/6/9 9:29:00
--  
 建议你不要用find函数,你直接把数据导入以后,用查询重复值的方法,把一些数据删除更好
--  作者:Bin
--  发布时间:2015/6/9 9:30:00
--  
搞个进度条吧, 或者用个Label提示.正在处理第几条数据.


--  作者:大红袍
--  发布时间:2015/6/9 9:36:00
--  

 有一种可能,是你边写入数据边find,所以要额外处理的,最后一次性写入,这样可能会快一些。

 

 具体的,你上传例子测试一下。http://www.foxtable.com/help/topics/2225.htm

 


--  作者:jspta
--  发布时间:2015/6/9 9:44:00
--  
 Dim dr As DataRow = DataTables("商品基本信息").Find("品名及规格 = \'" & bh & "\'")
        If dr Is Nothing Then \'如果不存在同编号的订单
            dr =  DataTables("商品基本信息").AddNew()
        End If

就这几句话足够卡死你了,建议你先建立以个过渡表,完全导入,用SQL语句去重复,然后再把这些数据添加进去就好了。