多个打开命令oledb连接用于查询Excel

时间:2015-09-08 17:18:00

标签: sql vb.net excel performance oledb

Private Function CreateConnString(ByVal Str As String) As String
    Return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Str & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"""
End Function
...
For Each sMatl_Num As String In alMaterialNumbers
                ifileNo = 1
                dbConnection.ConnectionString = CreateConnString(sExcelDBPath)
                dbCommand.Connection = dbConnection
                dbCommand.CommandText = "SELECT [col1], [col2], [col3], [col4], [col5], [col6] FROM [sheet$] WHERE [material]='" & sMatl_Num & "'" & " AND [col3] IS NOT NULL" & " AND [col6] IS NOT NULL"
                dbConnection.Open()
                dbReader = dbCommand.ExecuteReader()
                If dbReader.HasRows Then
                    Do While dbReader.Read
                        sCol1= dbReader.GetString(0).ToString
                        sCol2= dbReader.GetString(1).ToString
                        sCol3= dbReader.GetString(2).ToString
                        sCol4= dbReader.GetString(3).ToString
                        sCol5= dbReader.GetString(4).ToString
                        sCol6= dbReader.GetString(5).ToString
                     'Write txt file with name and content derived from these strings
                     Loop
                End If
                dbReader.Close()
                dbConnection.Close()
Next

我正在使用oledb查询Excel文件。有很多列可以从每行获取数据。这种情况非常缓慢。有没有办法可以优化这个?数组列表的计数大约是23k。

1 个答案:

答案 0 :(得分:1)

尝试仅打开连接一次,然后处理它作为记录集返回的行,然后关闭它。

因此,您可以更改SQL以按sMatl_Num对行进行排序,并使用where子句仅选择alMaterialNumbers中的MaterialNumbers(这可能是IN子句或子查询 - 它取决于可能有​​多少个值)< / p>

所以有了一个记录集,你可以遍历它写出每个MaterialNumbers的行,当数字改变写出到下一个文件...

这是否有意义。