如何在使用 Oledb 的其他用户使用时读取 excel?

Posted

技术标签:

【中文标题】如何在使用 Oledb 的其他用户使用时读取 excel?【英文标题】:How to read an excel while in use by another user with Oledb? 【发布时间】:2014-04-28 09:54:19 【问题描述】:

我在共享驱动器上有一个 excel,我的应用程序正在使用 Oledb 连接将数据从 excel 读取到 DataGridView。

    cn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0;" + "data source=" + skuPath + ";Extended Properties=""Excel 12.0;HDR=YES;""")
    q1 = "select * from [" + year + "$B4:AM300]"
    da = New System.Data.OleDb.OleDbDataAdapter(q1, cn)

    Try
        cn.Open()
        da.Fill(ds, "Table1")
    Catch e As OleDb.OleDbException
        Dim errorMsg As String
        Dim i As Integer
        errorMsg = ""
        For i = 0 To e.Errors.Count - 1
            errorMsg += "Index #" & i.ToString() & ControlChars.Cr _
                           & "Message: " & e.Errors(i).Message & ControlChars.Cr _
                           & "NativeError: " & e.Errors(i).NativeError & ControlChars.Cr _
                           & "Source: " & e.Errors(i).Source & ControlChars.Cr _
                           & "SQLState: " & e.Errors(i).SQLState & ControlChars.Cr
        Next i
    End Try

    cn.Close()
    dt = ds.Tables(0)

当 excel 文件已被其他用户打开时,您会在 excel 中收到此通知:

在这些情况下,我的代码在最后一行返回此错误:

An unhandled exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
Additional information: Cannot find table 0.

所以我的理解是,因为文件正在使用中,所以整个连接没有返回任何内容,因此数据表为空。 我找到了几种确定文件是否正在使用的方法,但没有关于如何从正在使用的文件中读取的方法。 是否可以?如果是的话怎么办?

请记住,我只需要读取文件,如果可以始终以只读方式打开它,那就太棒了!

【问题讨论】:

【参考方案1】:

你不能。即使您使用 ODBC(只读),您也必须在阅读之前关闭打开的文件。 参考:http://forums.asp.net/t/1083489.aspx?open+a+Microsoft+Jet+OLEDB+4+0+connection+to+excel+file+read+only

【讨论】:

以上是关于如何在使用 Oledb 的其他用户使用时读取 excel?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ASP.NET OLEDB 向数据库中添加一行?

为啥 OleDb ExecuteScalar 方法在查询 COUNT 时返回 Decimal?

使用OLEDB读取EXCEL数据时,为何读取不到单元格中的时间值,全是1900\1\0

ASP.NET OleDB 权限错误

C# MD5 和/或其他加密 oledb (access 2007)

告诉我 OLEDB 数据阅读器读取 excel 文件列的最大限制是多少?