以文本方式查看主题 - 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 ![]() dr(nms(m)) = Sheet(n,m).Value Next Next Tables("商品基本信息").ResumeRedraw() End If 谢谢大家的帮助 出于试验心态,将代码做如下修改(不find,直接导入),结果也是 数据量少的时候正常,导入2万行数据依然卡死,上传了实例,求突破!
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语句去重复,然后再把这些数据添加进去就好了。
|