Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用OleDB范围错误从Excel 2013文件读取非常大的数据_Sql_Vb.net_Excel_Oledb - Fatal编程技术网

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

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

我正在尝试在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
但我认为最好的解决方案是按块读取数据,因此我发现可以通过在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命令。:)