以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]数据写入远程数据库速度过慢  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=104052)

--  作者:magus1123
--  发布时间:2017/7/21 20:59:00
--  [求助]数据写入远程数据库速度过慢
现在的情况是这样的,每天有三张表的数据要导入到系统里,然后第二天将昨天导入的数据清除,然后重新将新数据导入进去。每张表格数据大概7000行。
现在用的是阿里云的服务器,导入一张表格耗时10分钟,每天光等就要等半小时。。。
用的源码是这个:
Dim dlg As new OpenFileDialog
dlg.Filter = "excel|*.xls"
If dlg.ShowDialog = DialogResult.OK Then
    DataTables("当前库存").DataRows.Clear
    Dim mg As New Merger
    mg.SourcePath = dlg.FileName
    mg.Format = "excel" \'指定格式
    mg.SourceTableName = "数据段1$" \'指定要合并的表
    mg.DataTableName = "当前库存" \'指定接收数据的表
    mg.Merge() \'开始合并
End If

表格“当前库存”为外部数据表。

老师有别的更好的方式吗?

--  作者:有点蓝
--  发布时间:2017/7/21 21:19:00
--  
参考:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=84350&authorid=0&page=0&star=1


--  作者:magus1123
--  发布时间:2017/7/21 21:28:00
--  
看了几遍。。没看懂什么意思。。。。
--  作者:有点蓝
--  发布时间:2017/7/21 21:50:00
--  
第一种用法,按照注释改改,自己测试,还是看不懂的,回头学学vb.net的基础

Dim tran As System.Data.SqlClient.SqlTransaction
try
    Dim conn As new System.Data.SqlClient.SqlConnection("server=voyo;uid=sa;pwd=hailun.;database=Test") \'改为自己数据库的连接字符串
    conn.Open() \'打开链接
    tran = conn.BeginTransaction()
    Dim mapping1 As new System.Data.SqlClient.SqlBulkCopyColumnMapping("第一列", "第一列") \'改为自己的列名,有多少列就增加多少个
    Dim mapping2 As new System.Data.SqlClient.SqlBulkCopyColumnMapping("第二列", "第二列")
    Dim copy As new System.Data.SqlClient.SqlBulkCopy(conn, System.Data.SqlClient.SqlBulkCopyOptions.Default, tran)
    Copy.ColumnMappings.Add(mapping1)
    Copy.ColumnMappings.Add(mapping2)
    copy.DestinationTableName = "表D" \'指定服务器上目标表的名称
    copy.BatchSize = 1000
    copy.WriteToServer(DataTables("表D").basetable)   \'你的datatable名字,执行把DataTable中的数据写入DB
    tran.Commit()                                  \'提交事务
    msgbox("OK")
catch ex As exception
    msgbox(ex.message)
    tran.Rollback()    \'返回False 执行失败!
End try

第二种用法,还是看不懂的回头看看帮助【编程基础】和【Foxtable编程】这2章内容
‘函数的参数用法看函数代码注释,改为自己的表名和列名进行测试
Dim strlist As  List(Of String)  = Functions.Execute("sql提取函数",Tables("凭证"),"凭证","_Identify","[_Identify]","摘要|科目名称|科目编码|部门编码|供应商名称","摘要|科目名称|科目编码|部门编码|供应商名称",1)

Dim sql As String
Dim cmd As New SQLCommand
cmd.C
Dim Count As Integer = 0
try
    Connections("cs").BeginTransaction
    
    For Each s As String In strlist
        cmd.CommandText = s
        Count += cmd.ExecuteNonQuery()
output.show(s)
    Next
    Connections("cs").Commit \'提交事务,所有操作生效
Catch ex As Exception \'如果出错
    msgbox(ex.message)
    Connections("cs").Rollback() \'回滚事务,撤销所有操作
End Try
Tables("凭证").DataTable.BaseTable.AcceptChanges()   \'提交修改

--  作者:magus1123
--  发布时间:2017/7/22 0:32:00
--  
已经用方法一成功解决!!谢谢老师!

给狐友们参考数据:
1、用原来的导入方式,7000行数据耗时10MIN
2、用老师的SQL语句,同样数据耗时3秒!不过需要做多另外一张格式一样的内部表,要导入的数据先用方法一导入到内部表,然后用方法二合并到外部数据表里。

--  作者:有点蓝
--  发布时间:2017/7/22 8:33:00
--  
第一步可以直接导入窗口表的:http://www.foxtable.com/webhelp/scr/2334.htm