Foxtable(狐表)用户栏目专家坐堂 → [求助]数据写入远程数据库速度过慢


  共有1615人关注过本帖树形打印复制链接

主题:[求助]数据写入远程数据库速度过慢

帅哥哟,离线,有人找我吗?
magus1123
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:94 积分:862 威望:0 精华:0 注册:2017/7/9 3:59:00
[求助]数据写入远程数据库速度过慢  发帖心情 Post By: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

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

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107230 积分:545405 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/7/21 21:19:00 [只看该作者]


 回到顶部
帅哥哟,离线,有人找我吗?
magus1123
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:94 积分:862 威望:0 精华:0 注册:2017/7/9 3:59:00
  发帖心情 Post By:2017/7/21 21:28:00 [只看该作者]

看了几遍。。没看懂什么意思。。。。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107230 积分:545405 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:94 积分:862 威望:0 精华:0 注册:2017/7/9 3:59:00
  发帖心情 Post By:2017/7/22 0:32:00 [只看该作者]

已经用方法一成功解决!!谢谢老师!

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107230 积分:545405 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/7/22 8:33:00 [只看该作者]

第一步可以直接导入窗口表的:http://www.foxtable.com/webhelp/scr/2334.htm

 回到顶部