Foxtable(狐表)用户栏目专家坐堂 → [求助]我需要批量导入上万条数据,看了下以往的帖子,没看懂,求教


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

主题:[求助]我需要批量导入上万条数据,看了下以往的帖子,没看懂,求教

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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
[求助]我需要批量导入上万条数据,看了下以往的帖子,没看懂,求教  发帖心情 Post By:2019/10/8 12:38:00 [显示全部帖子]

[求助]我需要批量导入上万条数据,看了下以往的帖子,没看懂,求教

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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/10/8 15:07:00 [显示全部帖子]

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=53006&skin=0
首先,他的代码里有错
Dim cmd As New SQLCommand
cmd.C
Dim Count As Integer = 0
其次没明白导入数据跟这个有什么关系



这个倒是可以,单只能弄几千条,搞个上万条就出错

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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/10/8 15:10:00 [显示全部帖子]

当前我用的是Access作为数据源

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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/10/9 11:13:00 [显示全部帖子]

sql语句合成这方法好像有点慢,我导了一万多,就进入假死状态了

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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/10/10 8:38:00 [显示全部帖子]

还有办法没?

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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/11/4 15:52:00 [显示全部帖子]

Dim st As Date = Date.Now
Dim strlist As  List(Of String)  = Functions.Execute("sql提取函数",Tables("账单"),"账单","运单号","运单号","收件扫描时间|客户名称|目的地|城市|结算重量|签收网点|运费|重量|加收费","收件扫描时间|客户名称|目的地|城市|结算重量|签收网点|运费|重量|加收费",1)

If strlist.count = 0 Then Return  Nothing

Dim sql As String
Dim cmd As New SQLCommand
cmd.Connecti
Dim Count As Integer = 0

For Each s As String In strlist
    cmd.CommandText = s
    Count += cmd.ExecuteNonQuery()
    Output.show(s)
Next

Tables("账单").DataTable.BaseTable.AcceptChanges()   '提交修改
Tables("账单").DataTable.Load             '刷新表
Output.show("影响了" & Count & "行")
MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")


想问问,我第一次执行这代码的时候正常执行,后面在执行就提示错误了,是哪里错了?

.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2019.10.3.1
错误所在事件:自定义函数sql提取函数
详细错误信息:
调用的目标发生了异常。
从类型“DBNull”到类型“String”的转换无效。




图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20191104155113.png
图片点击可在新窗口打开查看


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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/11/4 16:30:00 [显示全部帖子]

Dim tb As Table = Args(0)        '要提取的表格
Dim kName As String = Args(1)    '后台表格的名称
Dim tbid As String = Args(2)     '表格中的主键字段名
Dim kid As String = Args(3)      '后台表格的主键字段名
Dim bgzd As String = Args(4)     '表格中的字段,用|分割
Dim kbgzd As String = Args(5)    '对应的后台表中的字段,用|分割
Dim lx As Integer = Args(6)      '数据源的类型,Access=1,sql=2

'************  生成字段对应表 *****************************************************************

Dim bgzds() As String = bgzd.Split("|")
Dim kbgzds() As String = kbgzd.Split("|")
If bgzds.Length <> kbgzds.Length Then Return Nothing   '长度不等,说明设置错误,退出
Dim _表格_字段对应表 As New Dictionary(Of String, String)  '新建一个用于存放字段对应的字典
For Index As Integer = 0 To bgzds.Length - 1
    _表格_字段对应表.Add(bgzds(Index),kbgzds(Index))
Next

'********************  生成字段类型表 ***************************************************
Dim _表格_字段类型表 As New Dictionary(Of String, String)  '新建一个用于存放字段类型
'*************遍历获取列的类型
Dim s1 As String
For Each s As String In _表格_字段对应表.Keys
    s1 = "未知"
    With tb.DataTable.DataCols(s)
        If .IsString Then s1 = "文本"
        If .IsNumeric Then s1 = "数值"
        If .IsDate Then s1 = "日期"
        If .IsBoolean Then s1 = "逻辑"
    End With
    _表格_字段类型表.Add(s, s1)
Next
'
'获取主键列的类型
'
If tbid = "_Identify" Then
    s1 = "_Identify"
Else
    With tb.DataTable.DataCols(tbid)
        s1 = "未知"
        If .IsString Then s1 = "文本"
        If .IsNumeric Then s1 = "数值"
        If .IsDate Then s1 = "日期"
    End With
End If
_表格_字段类型表.Add(tbid, s1)

Dim strlist As New List(Of String)   '定义一个集合,用于返回

'
'获取对象
'
Dim systable As System.Data.DataTable = tb.DataTable.BaseTable
'

Dim sql As String
Dim str As String
Dim ChangeTable As System.Data.DataTable = systable.GetChanges(System.Data.DataRowState.Added)  '获取新增记录

If ChangeTable IsNot Nothing Then '如果有新增记录
    '
    '循环获取新增语句
    
    Dim sql11 As String = "INSERT INTO " & kName & " ("
    
    '生成语句前导
    For Each str1 As String In _表格_字段对应表.Values
        sql11 += str1 & ","
    Next
    sql11 = sql11.Trim(",") & ") VALUES ("
    
    For Each dr As System.Data.DataRow In ChangeTable.Rows
        '遍历设置列值
        sql = sql11
        For Each str1 As String In _表格_字段对应表.Keys
            str = "'" & dr(str1) & "',"
            Select Case _表格_字段类型表(str1)
                Case "数值"
                    str = dr(str1) & ","
                Case "逻辑"
                    If dr(str1) Then
                        str = "1,"
                    Else
                        str = "0,"
                    End If
                Case "日期"
                    If lx = 1 Then   'Access
                        str = "#" & dr(str1) & "#,"
                    End If
            End Select
            If str.Trim(","," ").Trim = "" OrElse str.Trim(",","#"," ") = "" OrElse str.Trim(",","'"," ")= "" Then
                sql += "null,"
            Else
                sql += str
            End If
        Next
        sql = sql.Trim(",") & ")"
        strlist.Add(sql)
    Next
End If
Dim strkey As String
'***********   合成修改语句 *********************
ChangeTable  = systable.GetChanges(System.Data.DataRowState.Modified)   ' 获取修改记录集
'
'如果没有修改记录,返回空值
'
If ChangeTable IsNot Nothing Then
    For Each dr As System.Data.DataRow In ChangeTable.Rows    '循环获取修改语句
        '获取主键值
        strkey = dr(tbid)
        Select Case _表格_字段类型表(tbid)
            Case "文本"
                strkey = "'" & dr(tbid) & "'"
            Case "日期"
                If lx = 1 Then
                    strkey = "#" & dr(tbid) & "#"
                Else
                    strkey = "'" & dr(tbid) & "'"
                End If
        End Select

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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/11/4 16:34:00 [显示全部帖子]


        
        '遍历设置列值
        sql = "UPDATE " & kName & " Set  "
        For Each str1 As String In _表格_字段对应表.Keys
            str = "'" & dr(str1) & "'"
            Select Case _表格_字段类型表(str1)
                Case "数值"
                    str =  dr(str1)
                Case "逻辑"
                    If dr(str1) Then
                        str =  "1"
                    Else
                        str =  "0"
                    End If
                    
                Case "日期"
                    If lx = 1 Then   'Access
                        str = "#" & dr(str1) & "#"
                    Else
                        str = "'" & dr(str1) & "'"
                    End If
            End Select
            If str.Trim(","," ").Trim = "" OrElse str.Trim(",","#"," ") = "" OrElse str.Trim(",","'"," ")= "" Then
                
                sql +=  _表格_字段对应表(str1) & "=null, "
            Else
                sql +=  _表格_字段对应表(str1) & "=" & str & ", "
            End If
        Next
        sql = sql.Trim(" ",",") & "  Where " & kid & "=" & strkey
        strlist.Add(sql)
    Next
End If



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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/11/4 16:35:00 [显示全部帖子]


'获取删除记录
'
ChangeTable = systable.GetChanges(System.Data.DataRowState.Deleted)
'
'如果没有删除记录,返回空值
'
If ChangeTable IsNot Nothing Then
    '

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


加好友 发短信
等级:六尾狐 帖子:1483 积分:10551 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2019/11/4 16:36:00 [显示全部帖子]


    '循环获取删除语句    
    
    For Each dr As System.Data.DataRow In ChangeTable.Rows
        '获取主键值
        strkey = dr(tbid,System.Data.datarowversion.original).tostring
        'strkey = dr(tbid)
        Select Case _表格_字段类型表(tbid)
            Case "文本"
                strkey = "'" & strkey & "'"
            Case "日期"
                If lx = 1 Then
                    strkey = "#" & strkey & "#"
                Else
                    strkey = "'" & strkey & "'"
                End If


 回到顶部
总数 13 1 2 下一页