以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  狐表大量数据保存的问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=106990)

--  作者:qqibai
--  发布时间:2017/9/19 18:07:00
--  狐表大量数据保存的问题

在狐表导入EXCEL文件,6000条数据,处理时间10秒

如果直接保存,大概要12分钟

试着用sql语句生成,因为数据每次都要更新,所以我是清空表然后新增行,所以都是Insert命令,还是要10分钟

求老师给个方法,6000条数据保存就要十分钟,有没有好的办法

 

自己瞎凑的代码如下

 

 

Dim p As WinForm.ProgressBar = e.Form.Controls("ProgressBar1")
p.Visible = True
Dim file As WinForm.TextBox = e.Form.Controls("file")
Dim filename As String = file.Value
If file.Value = "" Then
    MessageBox.show("文件不存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else Dim test As String = filename.SubString(filename.Length - 3)
    If test <> "csv" And test <> "xls" And test <> "lsx"Then
        MessageBox.show("文件不存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Else
        Dim Book As New XLS.Book(filename)
        Dim Sheet As XLS.Sheet = Book.Sheets(0)
        Tables("储蓄台账").StopRedraw()
        DataTables("储蓄台账").DeleteFor("")
        Dim cmd1 As new SQLCommand
        Dim cc As String
        cmd1.C
        cc = "truncate Table 储蓄台账"
        cmd1.CommandText = cc
        cmd1.ExecuteNonQuery
        Dim nms() As String = {"客户号","客户姓名","上月储蓄日均","本月储蓄日均","上月储蓄余额","本月储蓄余额","活期存款余额","活期存款月日均"}
        Dim cn As Integer = Sheet.Rows.Count
        p.Maximum = cn - 1 \'设置最大值
        p.Minimum = 0 \'设置最小值
        p.Value = 0 \'设置当前值
        For n As Integer = 1 To Sheet.Rows.Count -1
            Dim bh As String = sheet(n,0).Text
            Dim bha As String = bh.SubString(bh.Length - 8)
            Dim fdr As DataRow = DataTables("商户台账").Find("客户号 = \'" & bha & "\'")
            If  fdr IsNot Nothing Then
                Dim dr As DataRow =  DataTables("储蓄台账").AddNew()
                dr(nms(0)) = bha
                For m As Integer = 1 To nms.Length - 1
                    dr(nms(m)) = Sheet(n,m).Value
                Next
                dr("工号") = fdr("工号")
                Dim cd As String = "(\'" & dr("客户号") & "\',\'" & dr("客户姓名") & "\'," & dr("上月储蓄日均") & "," & dr("本月储蓄日均") & "," & dr("上月储蓄余额") & "," & dr("本月储蓄余额") & "," & dr("活期存款余额") & "," & dr("活期存款月日均") & "," & dr("工号") & ")"
                Dim cmd As new SQLCommand
                cmd.C
                Dim c As String = "INSERT INTO [sq_opldg52004].[储蓄台账] (客户号,客户姓名,上月储蓄日均,本月储蓄日均,上月储蓄余额,本月储蓄余额,活期存款余额,活期存款月日均,工号) VALUES " & cd
                cmd.CommandText = c
                cmd.ExecuteNonQuery
            End If
            If n Mod 100 = 0 Then
                p.Value = n
            End If
        Next
        Tables("储蓄台账").ResumeRedraw()
        msgbox("共导入: " &  cn & " 条数据!")
        Forms("导入存款").Close
    End If
End If


--  作者:有点甜
--  发布时间:2017/9/19 18:39:00
--  

不要在导入的时候执行 cmd.ExecuteNonQuery

 

你可以先导入,然后再保存,参考 http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=98689&skin=0

 


--  作者:qqibai
--  发布时间:2017/9/19 19:29:00
--  

我一开始就是单独做保存,试了也需要那么久额

后来放到里面,速度没什么变化,我明天再试试看


--  作者:有点蓝
--  发布时间:2017/9/19 20:15:00
--  
Sqlserver如果全部插入可以试试SqlBulkCopy

http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=84350

--  作者:cbt
--  发布时间:2017/9/19 20:25:00
--  
 把  VALUES 批量 拼接,一次插入!
参考:

INSERT INTO MyTable(ID,NAME) VALUES(7,\'003\'),(8,\'004\'),(9,\'005\');
--  作者:qqibai
--  发布时间:2017/9/20 10:41:00
--  
以下是引用cbt在2017/9/19 20:25:00的发言:
 把  VALUES 批量 拼接,一次插入!
参考:

INSERT INTO MyTable(ID,NAME) VALUES(7,\'003\'),(8,\'004\'),(9,\'005\');

测试了,少量数据还行,5000条数据狐表假死了,不知道是不是超出了sql语句长度还是其他的,没显示未响应,但是也没做任何数据处理


--  作者:qqibai
--  发布时间:2017/9/20 11:37:00
--  
以下是引用有点蓝在2017/9/19 20:15:00的发言:
Sqlserver如果全部插入可以试试SqlBulkCopy

http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=84350

牛逼,不到5秒完成,原来要十分钟


--  作者:有点甜
--  发布时间:2017/9/20 11:54:00
--  
以下是引用qqibai在2017/9/19 19:29:00的发言:

我一开始就是单独做保存,试了也需要那么久额

后来放到里面,速度没什么变化,我明天再试试看

 

不可能需要这么久的,你不能sql语句一句一句执行,你要把所有sql语句一次性提交。

 

有问题的例子发上来看看。


--  作者:qqibai
--  发布时间:2017/9/20 13:37:00
--  
以下是引用有点甜在2017/9/20 11:54:00的发言:

 

不可能需要这么久的,你不能sql语句一句一句执行,你要把所有sql语句一次性提交。

 

有问题的例子发上来看看。

对,原来按照论坛帖子做的sql函数提取,他是一条一条生成,一条一条保存的,很慢

昨晚看到说可以直接生成一条来保存,试了一下,一次性5000条狐表卡死,数据库未更新,没有再去测试1000条、500条的数据

直接用SqlBulkCopy,5秒搞定了


--  作者:有点甜
--  发布时间:2017/9/20 14:38:00
--  
以下是引用qqibai在2017/9/20 13:37:00的发言:

对,原来按照论坛帖子做的sql函数提取,他是一条一条生成,一条一条保存的,很慢

昨晚看到说可以直接生成一条来保存

 

不,可,能。你加上事务

 

http://www.foxtable.com/webhelp/scr/2933.htm

 

或者直接测试2楼的例子 http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=98689&skin=0