gpt4 book ai didi

sql - 使用 OleDB 范围错误从 Excel 2013 文件中读取非常大的数据

转载 作者:行者123 更新时间:2023-12-04 20:40:29 26 4
gpt4 key购买 nike

我正在尝试在 OleDB 的帮助下使用 Visual Basic.NET 读取 Excel 2013 文件(.xlsx,大小约为 100 MB)。主要问题是让系统出现内存不足异常:

da.Fill(dt)

从下面的代码。
Private Function ReadExcelFile() As DataSet
Dim ds As New DataSet()

Dim connectionString As String =
"Provider=Microsoft.ACE.OLEDB.12.0;;Extended Properties=Excel 12.0 XML;Data Source=C:\file.xlsx;"

Using connection As New OleDbConnection(connectionString)
connection.Open()
Dim cmd As New OleDbCommand()
cmd.Connection = connection
Dim dtSheet As DataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)

For Each dr As DataRow In dtSheet.Rows
Dim sheetName As String = dr("TABLE_NAME").ToString()
If Not sheetName.EndsWith("$") Then
Continue For
End If

cmd.CommandText = "SELECT * FROM [" & sheetName & "];"
Dim dt As New DataTable()
dt.TableName = sheetName
Dim da As New OleDbDataAdapter(cmd)
da.Fill(dt)
ds.Tables.Add(dt)
Next

cmd = Nothing
connection.Close()
End Using
Return ds
End Function

但我认为最好的解决方案是按 block 读取数据,所以我发现可以通过在 SQL 语句中添加列范围来读取数据,如下所示:
 cmd.CommandText = "SELECT * FROM [" & sheetName & "B1:B10];"

我通过在该范围上进行增量来执行循环,但我发现了一个错误。以此为例,
cmd.CommandText = "SELECT * FROM [" & sheetName & "B50000:B51000];"

它仍然有效。但是,如果我这样做,
cmd.CommandText = "SELECT * FROM [" & sheetName & "B70000:B70001];"

我得到这个错误。

OleDb Error

请注意,Excel 文件有 475128 行,而 B70000-B70001 甚至不到总数的一半。

Total Columns

任何人都可以解释一下吗?我想我在这里遗漏了一些东西。

最佳答案

我找到了一个可行的解决方案。不使用 DataSet,而是使用 DataReader。我可以添加一个 worker ,这样它就不会挂断。

 Private Function ReadExcelFile() As DataSet
Dim ds As New DataSet()

Dim connectionString As String = GetConnectionString()

Using connection As New OleDbConnection(connectionString)
connection.Open()
Dim cmd As New OleDbCommand()
cmd.Connection = connection
Dim dtSheet As DataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)

For Each dr As DataRow In dtSheet.Rows
Dim sheetName As String = dr("TABLE_NAME").ToString()
If Not sheetName.EndsWith("$") Then
Continue For
End If
cmd.CommandText = "SELECT * FROM [" & sheetName & "];"
Dim ddr As OleDbDataReader = cmd.ExecuteReader()
Dim counter As Integer = 0
While (ddr.Read())
MessageBox.Show(ddr.GetValue(0))
End While
Next
cmd = Nothing
connection.Close()
End Using
Return ds
End Function

这些行:
Dim ddr As OleDbDataReader = cmd.ExecuteReader()
Dim counter As Integer = 0
While (ddr.Read())
MessageBox.Show(ddr.GetValue(0))
End While

是您可以访问第一列(索引 0)的行的基本代码。这是有效的,因为我读到 DataSet 是一个内存对象(这就是为什么我们可以得到系统内存不足异常的原因) - Check here for reference

我仍然想知道为什么我的上述问题会出现。

关于sql - 使用 OleDB 范围错误从 Excel 2013 文件中读取非常大的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com