Foxtable(狐表)用户栏目专家坐堂 → [求助] 导入数据量 过大 卡死


  共有2503人关注过本帖树形打印复制链接

主题:[求助] 导入数据量 过大 卡死

帅哥哟,离线,有人找我吗?
logicsun
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:523 威望:0 精华:0 注册:2015/4/19 17:37:00
[求助] 导入数据量 过大 卡死  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/6/9 9:28:00 [只看该作者]

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

 

 耗时在find函数那里。


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/6/9 9:29:00 [只看该作者]

 建议你不要用find函数,你直接把数据导入以后,用查询重复值的方法,把一些数据删除更好

 回到顶部
帅哥哟,离线,有人找我吗?
Bin
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2015/6/9 9:30:00 [只看该作者]

搞个进度条吧, 或者用个Label提示.正在处理第几条数据.


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/6/9 9:36:00 [只看该作者]

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

 

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

 


 回到顶部
帅哥哟,离线,有人找我吗?
jspta
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1731 积分:11255 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2015/6/9 9:44:00 [只看该作者]

 Dim dr As DataRow = DataTables("商品基本信息").Find("品名及规格 = '" & bh & "'")
        If dr Is Nothing Then '如果不存在同编号的订单
            dr =  DataTables("商品基本信息").AddNew()
        End If

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

 回到顶部