以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [讨论]Table复制粘贴大量数据的效率  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=178738)

--  作者:zhutangxin
--  发布时间:2022/7/18 15:54:00
--  [讨论]Table复制粘贴大量数据的效率
需要大量数据保存至Sql Server,有二种方法,
一是从前台在相应的Table中,将数据复制粘贴进去,再保存,此方法类似Excel,用户比较容易接受。但数据量较大时(如3万行),效率太低,与Excel相差较大。
二是用Sql BulkCopy方法,编写代码,导入至数据库,此方法效率很高,局域网内部几乎可以达到1w 条/秒。此方法的劣势是需要编写代码,要求源数据的格式(特别是表头)要一致。

由于第一个方法有易用性的特点,最近想改造一下保存的代码,对新增的数据用合成Insert语句的方法进行处理,理论上可以提高前台的保存效率。
Insert into tblName (Fields list)
Values
  (1st vals list)
, (2nd vals list)
, (3rd vals list)
, ....
, (n vals list)
上述格式语句,Sql Server支持一次性插入 n<= 1000条记录,如果记录是几万条,也需分批处理。

但刚才按此思路写代码时,发现大批量粘贴数据再保存的主要效率损失可能不在保存的过程,而是在粘贴的过程。似乎Table每个单元格在接收到数据时,都会做数据验证(数据类型,对字符串型还验证长度),3w条数据(25列)从Ctrl + V开始到数据在前台完全显示出来要4分钟,而保存差不多3分钟左右。

请问,有没有方法在复制粘贴即按下CTRL + V的时候,让Table不验证数据,类似于Excel一样,直接粘贴?如果无法做到,那用合成Insert 语句的代来改善保存速度就意义不大了。
请赐教!


--  作者:zhutangxin
--  发布时间:2022/7/18 16:00:00
--  
补充,在粘贴的过程中CPU占用百分比很高,能达到20%,而保存的过程CPU占比约3%左右。
--  作者:有点蓝
--  发布时间:2022/7/18 16:08:00
--  
没有办法。反正都是使用代码,为什么不使用Sql BulkCopy?Sql BulkCopy不要求表头一致,做好映射即可
[此贴子已经被作者于2022/7/18 16:08:36编辑过]

--  作者:zhutangxin
--  发布时间:2022/7/18 16:16:00
--  
如果用前台的复制粘贴,打算写一个通用的方法,调试好了之后就不需要再写代码了。复制粘贴的灵活性会更好一些,对源数据的规范性要求要低一些,如列的次序可以通过拖动Table的列标题来实现一致,一个Excel中,如果有多个Sheet都是数据源,可以分别复制粘贴,而不需要用户先将所有的数据粘贴到一张表,再标准命名文件名,Sheet名,列名。



--  作者:有点蓝
--  发布时间:2022/7/18 16:37:00
--  
不要用使用execl的思维来使用Foxtable。我看不出来好处在哪里。粘贴的性能问题可以考虑屏蔽事件,和表达式列

不如看看:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=105144