以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]大数据量的导入和保存  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=103365)

--  作者:chnfo
--  发布时间:2017/7/6 15:42:00
--  [求助]大数据量的导入和保存
用外部access做数据库。
导入一个10万行,5列的Excel表。如用merger方法,合并数据用时35秒左右,但保存却要用232秒。
如果是1万行,合并2秒即完成,但保存要22秒。

是否可以用后台方法直接往数据库文件中合并数据,然后再load在前台界面上?

或者其它更好方法?

--  作者:有点甜
--  发布时间:2017/7/6 15:58:00
--  

用这种方法保存

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=98689&skin=0

 

 


--  作者:chnfo
--  发布时间:2017/7/6 22:51:00
--  
方法挺好,效率比直接写datatables("A").save()快了N多倍,2万行数据包括导入到保存也就是17秒的样子。
但这个有一个小问题。
自定义函数中,要求每一列都需要有值。但有时候,并不是每个单元格里都有值的。就比如方说,有些时候采购的商品有赠品,在入账的时候,有商品ID、数量,但并不一定有单价。当有的单元格里有空值时,会报出错误。

.NET Framework 版本:2.0.50727.8745
Foxtable 版本:2017.6.12.1
错误所在事件:自定义函数ABC(这是我自己取的名字)
详细错误信息:
调用的目标发生了异常。
从类型“DBNull”到类型“String”的转换无效。

如何解决这个问题呢?

[此贴子已经被作者于2017/7/6 22:52:09编辑过]

--  作者:有点甜
--  发布时间:2017/7/6 23:47:00
--  
以下是引用chnfo在2017/7/6 22:51:00的发言:
 
自定义函数中,要求每一列都需要有值。但有时候,并不是每个单元格里都有值的。就比如方说,有些时候采购的商品有赠品,在入账的时候,有商品ID、数量,但并不一定有单价。当有的单元格里有空值时,会报出错误。

 
[此贴子已经被作者于2017/7/6 22:52:09编辑过]

 

不应该有你这种问题。当值为空值的时候,合成的sql语句是null,没问题的。

 

你使用表数据的时候出错?判断dbnull这样写 If dr("字段") = dbnull.value Then


--  作者:chnfo
--  发布时间:2017/7/7 9:16:00
--  
不是这意思,在button事件中,列组合增加一列,例如把日期列加进去,就出错了。就是日期|产品编码|客户编码……,那儿
--  作者:有点甜
--  发布时间:2017/7/7 9:18:00
--  
 例子测试没问题。实例说明。
--  作者:chnfo
--  发布时间:2017/7/7 15:00:00
--  
是我的错,把表达式列进去了。
不过,感觉那个自定义函数:SQL提取是不是有点考虑过多了?因为如果用外部数据源的话,一般情况下,表的名称和列字段名都是一样的,那么
Dim tbid As String = Args(2)     \'表格中的主键字段名
Dim kid As String = Args(3)      \'后台表格的主键字段名
Dim bgzd As String = Args(4)     \'表格中的字段,用|分割
Dim kbgzd As String = Args(5)    \'对应的后台表中的字段,用|分割
这里面的tbid和Kid、bgzd和kbgzd应当是一致的。
如果是这样的话,函数应当简洁得多。

如果我的假设成立,那么这个自定义函数应当咋改一下?

--  作者:chnfo
--  发布时间:2017/7/7 15:01:00
--  
而且,要提取的表名和后台表名也会一致。

一般情况下

--  作者:有点甜
--  发布时间:2017/7/7 15:07:00
--  
以下是引用chnfo在2017/7/7 15:00:00的发言:

如果我的假设成立,那么这个自定义函数应当咋改一下?

 

直接赋值即可,如

 

Dim tbid As String = Args(2)     \'表格中的主键字段名
Dim kid As String = tbid      \'后台表格的主键字段名
Dim bgzd As String = Args(3)     \'表格中的字段,用|分割
Dim kbgzd As String = bgzd    \'对应的后台表中的字段,用|分割
 
调用的时候,对应传递参数。

--  作者:chnfo
--  发布时间:2017/7/11 17:46:00
--  


选中TbWBS表的第8行,然后修改从表中任一行的A值,此时,TbWBS表的第8行的V值会发生变化。

这时候,执行窗口中的button1事件(也就是准备保存TBWL表时),会报出错误。

.NET Framework 版本:2.0.50727.8669
Foxtable 版本:2017.6.12.1
错误所在事件:自定义函数SQLCatch
详细错误信息:
调用的目标发生了异常。
找不到父关系“PL2WL”。

执行button2事件(也就是准备保存TBWBS时),也报出错误
.NET Framework 版本:2.0.50727.8669
Foxtable 版本:2017.6.12.1
错误所在事件:自定义函数SQLCatch
详细错误信息:
调用的目标发生了异常。
从类型“DBNull”到类型“String”的转换无效。

是不是表有关联的时候,就不能保存呀?
问题出在哪里呢?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:保存关联表的时候报错.rar