0

我已经尝试了许多不同的方法来构建一个允许用户选择一个 Excel 文件然后从该文件中读取数据的页面。到目前为止,我得到的只是错误。

我最新的错误是:“无法更新。数据库或对象是只读的。”

这是我的代码:

Protected Sub Upload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Upload.Click
    If (testFile.HasFile) Then
        Dim ds As DataSet
        Dim strFileType As String = System.IO.Path.GetExtension(testFile.FileName).ToString().ToLower()

        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & testFile.FileName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=2")

        ' Select the data from Sheet1 ([in-house$]) of the workbook.
        MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection)

        ds = New System.Data.DataSet
        MyCommand.Fill(ds) - __This is where the error points.__
        grvExcelData.DataSource = ds.Tables(0)

    End If
End Sub

关于为什么要抛出这个的任何想法?我现在只是想将数据输出到gridview。稍后我将需要遍历每个单元格,但我一次尝试一步。

另外,如果有更好的方法可以做到这一点,我完全愿意接受!

谢谢!

4

1 回答 1

0

但是strFileType是您要打开的文件的扩展名。(对于 filename.xls 的 IE,它只是 .xls 部分)
您可能想要完整的文件名。

    MyConnection = New System.Data.OleDb.OleDbConnection( _
    "provider=Microsoft.Jet.OLEDB.4.0; " & _
    "data source=" & testFile.FileName & "; " & _
    "Extended Properties=Excel 8.0")

现在,对于“更好的部分”:
您不会关闭连接,这永远不会发生。一个简单的 Using 块将节省您

    Using MyConnection = New OleDbConnection( _
        "provider=Microsoft.Jet.OLEDB.4.0; " & _
        "data source=" & strFileType & "; " & _
        "Extended Properties=Excel 8.0")

        ' Select the data from Sheet1 ([in-house$]) of the workbook.
        Using MyCommand = New OleDbDataAdapter("select * from [Sheet1$]", MyConnection)
            Dim ds = New System.Data.DataSet
            MyCommand.Fill(ds) 
        End Using
    End Using

我建议添加 Import 指令以避免每个 OleDb 变量的命名空间前缀过长

于 2013-03-15T18:26:22.650 回答