Sql 使用OleDB范围错误从Excel 2013文件读取非常大的数据
我正在尝试在OleDB的帮助下使用Visual Basic.NET读取Excel 2013文件(.xlsx,大小约为100 MB)。主要问题是在生产线中出现系统内存不足异常:Sql 使用OleDB范围错误从Excel 2013文件读取非常大的数据,sql,vb.net,excel,oledb,Sql,Vb.net,Excel,Oledb,我正在尝试在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.OLED
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
但我认为最好的解决方案是按块读取数据,因此我发现可以通过在SQL语句中添加一个列范围来读取数据,如下所示:
cmd.CommandText = "SELECT * FROM [" & sheetName & "B1:B10];"
我在那个范围内做了一个循环,但我发现了一个错误。以此为例,
cmd.CommandText = "SELECT * FROM [" & sheetName & "B50000:B51000];"
它仍然有效。但是如果我这样做了,
cmd.CommandText = "SELECT * FROM [" & sheetName & "B70000:B70001];"
我得到这个错误
请注意,Excel文件有475128行,B70000-B70001甚至还不到总数的一半
有人能解释一下吗?我想我遗漏了一些东西。我找到了一个有效的解决方案。使用DataReader而不是DataSet。我可以添加一个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)的行的基本代码。这是因为我读到数据集是内存中的对象(这就是为什么我们可以获得系统内存不足异常的原因)——
我仍然想知道为什么会出现上述问题。您执行了查询吗?在
cmd=Nothing
之后,我看不到cmd.ExecuteNonQuery()
line.Hi。cmd.ExecuteNonQuery()不应该用于不需要数据集的操作,如INSERT、UPDATE等吗?据我所知,da.Fill已经执行了SQL命令。:)