以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  大数据文本读取操作  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=193438)

--  作者:YDS
--  发布时间:2024/9/13 18:23:00
--  大数据文本读取操作
Dim lj As String = Args(0)
Dim bh As String = Args(1)
Dim jc As String = Args(2)
Dim sl As Integer = Args(3)
Dim i As Long = 0
Dim line As String
If Forms("AC200").Opened Then
    Dim constring As String = "Server=192.168.1.254;Database=AC200;User Id=AC200;Password=r6XcbWt7NWn7;"
    Using conn As System.Data.SqlClient.SqlConnection = New System.Data.SqlClient.SqlConnection(constring)
        conn.Open() \'打开链接
        Using copy = New System.Data.SqlClient.SqlBulkCopy(conn)
            copy.Destinati \'指定服务器上目标表的名称
            Dim cls() As String = {"编号", "架次", "时标", "目标转速", "实际转速", "控制器状态", "电压", "电流"}
            Dim clss() As String = {"时标", "目标转速", "实际转速", "控制器状态", "电压", "电流"}
            For Each cl As String In cls
                copy.ColumnMappings.Add(cl, cl)
            Next
            copy.BatchSize = 1000
            copy.BulkCopyTimeout = 3600
            Dim drs As New List(Of System.Data.DataRow)(sl)
            Using sr As IO.StreamReader = New IO.StreamReader(lj) \'直接从文件路径生成\'    
                line = sr.ReadLine() \'读取一行    
                i = 1
                Forms("AC200").Controls("js").Text = i
                Dim idx As Integer = 1
                Dim dr As System.Data.DataRow
                Dim dt As System.Data.DataTable = DataTables("AC200").basetable.clone
                Do While line IsNot Nothing \'如果不为空继续执行.为空说明读取完毕,结束循环              
                    \'数据处理
                    dr = dt.NewRow()
                    dr("编号") = bh
                    dr("架次") = jc
                    Dim ls() As String = line.Split(",")
                    For ii As Integer = 0 To ls.Length - 1
                        dr(clss(ii)) = ls(ii)
                    Next
                    drs.Add(dr)
                    If idx = sl Then
                        copy.WriteToServer(drs.ToArray)
                        idx = 1
                        drs.Clear
                        dt.Clear
                    Else
                        idx += 1
                    End If 
                    i = i + 1
                    Forms("AC200").Controls("js").Text = i
                    line = sr.ReadLine() \'读取下一行   
                Loop 
            End Using
            If drs.Count > 0 Then
                copy.WriteToServer(drs.ToArray)
                drs.Clear
            End If
            Forms("AC200").Controls("js").Text = "OK"
        End Using
    End Using
End If
GC.Collect()


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20240913182144.jpg
图片点击可在新窗口打开查看

使用以上代码导入大概200w行以后就会报错,有没有什么解决方法?

--  作者:有点蓝
--  发布时间:2024/9/13 20:02:00
--  
报什么错?
--  作者:YDS
--  发布时间:2024/9/14 7:52:00
--  
超出内存
--  作者:有点蓝
--  发布时间:2024/9/14 8:41:00
--  
导入按钮的代码发一下。

方便把这个文本文件发上来测试一下

--  作者:YDS
--  发布时间:2024/9/14 8:48:00
--  
导入按钮的代码
SystemReady = False
Functions.AsyncExecute("TXTR", e.Form.Controls("lj").Value, e.Form.Controls("bh").Value, e.Form.Controls("jc").Value)
SystemReady = True

--  作者:有点蓝
--  发布时间:2024/9/14 8:52:00
--  
几个控件分别填写的是什么值?
--  作者:YDS
--  发布时间:2024/9/14 8:59:00
--  
C:\\Users\\Administrator\\Desktop\\AMRunLog_2244-_1124.TXT
2244
1134
10000

--  作者:有点蓝
--  发布时间:2024/9/14 9:20:00
--  
看不出什么问题,方便把文本文件发给客服测试一下
--  作者:YDS
--  发布时间:2024/9/14 16:58:00
--  
文件太大,发不过来,是不是datatable也有行数限制?
--  作者:有点蓝
--  发布时间:2024/9/14 17:09:00
--  
代码有每10000行就清空的代码,不是datatable的问题。

文件大发给QQ客服测试