Question

I'm trying to import an Excel sheet into datagridview, but I'm getting hit with an error: "database or object is read-only." However, the workbook I'm referencing does not have the read-only attribute applied. That being said, the workbook I'm connecting to is already open if my application is running, so I suspect this is the reason I'm getting hit with this error. The workbook is open, thus appears to the system as read-only when trying to fill the dataset.

Am I right in this assumption? Is their a way to import an Excel sheet into datagridview using the OleDB connection if the workbook I'm connecting to is open? If not, is there any other way to populate this datagridview without having to do a massive loop through my sheet? My code is as follows:

   Try

        'connect to Excel data source and set gridview equal to dataset (entire sheet should be visible in gridview)
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
        Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & StatVar.workbookName & ";Extended Properties=""Excel 12.0;HDR=YES;Readonly=False"";" 'may need to use different MS provider and lower OLEDB for .xls files (Microsoft.Jet.OLEDB4.0...Excel 8.0) kind of sketchy though
        MyConnection = New System.Data.OleDb.OleDbConnection(connstring) 'create a new data connection to Excel data source
        MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Budget$]", MyConnection) 'query the sheet - select all data
        MyCommand.TableMappings.Add("Table", "Table") 'map data selection as table
        StatVar.DtSet1 = New System.Data.DataSet 'create new data set
        MyCommand.Fill(StatVar.DtSet1) 'fill data set with table
        Form14.DataGridView1.DataSource = StatVar.DtSet1.Tables(0) 'populate gridview with data set table
        MyConnection.Close()
        Form14.ShowDialog()
    Catch exc As Exception
        MessageBox.Show("There was a problem loading this database. Please contact an administrator if the problem continues." & vbNewLine & vbNewLine & "Error: " & exc.Message)

    End Try

I'm getting hit with the error here:

MyCommand.Fill(StatVar.DtSet1)    
Was it helpful?

Solution

Did you try changing the connstring; set ReadOnly=True

If that doesn't work, you can make a copy of the workbook and then query that copy. If you do that it gets you the workbook as it was last saved. If that is a problem, you can do a save on the open workbook before copying.

Or better, simply ask the user to close the workbook before running the code.

OTHER TIPS

    Try
        Cursor = Cursors.WaitCursor
        'can't populate gridview with an open file using OLEDB - need to export the Budget sheet to a new file, close it, connect with OLEDB, then delete the temp Budget.xls file just created
        'copy Budget sheet to new workbook, delete unneeded columns, save file as Budget.xls, close workbook
        Dim filenm = "W:\TOM\ERIC\Budget Temp\Budget.xls"
        StatVar.xlApp.Sheets("Budget").Copy()
        StatVar.xlApp.ActiveWorkbook.Sheets("Budget").Columns("C:DY").Delete()
        StatVar.xlApp.ActiveWorkbook.SaveAs("W:\TOM\ERIC\Budget Temp\Budget.xls")
        StatVar.xlApp.ActiveWorkbook.Close(True)

        'connect to Excel data source and set gridview equal to dataset (entire sheet should be visible in gridview)
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
        Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & filenm & ";Extended Properties=""Excel 12.0;HDR=YES;Readonly=False"";" 'may need to use different MS provider and lower OLEDB for .xls files (Microsoft.Jet.OLEDB4.0...Excel 8.0) kind of sketchy though
        MyConnection = New System.Data.OleDb.OleDbConnection(connstring) 'create a new data connection to Excel data source
        MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Budget$A:F]", MyConnection) 'query the sheet - select all data in columns A:F
        MyCommand.TableMappings.Add("Table", "Table") 'map data selection as table
        StatVar.DtSet1 = New System.Data.DataSet 'create new data set
        MyCommand.Fill(StatVar.DtSet1) 'fill data set with table
        Form14.DataGridView1.DataSource = StatVar.DtSet1.Tables(0) 'populate gridview with data set table
        MyConnection.Close()

        'delete temporary Budget.xls file created at beginning of procedure and show Budget Codes form
        File.Delete(filenm)
        Form14.TxtBoxAutoCode.Text = StatVar.xlApp.Sheets("Budget").Range("EU2").Text
        Form14.ShowDialog()
    Catch exc As Exception
        MessageBox.Show("There was a problem loading this database. Please contact an administrator if the problem continues." & vbNewLine & vbNewLine & "Error: " & exc.Message)
    Finally
        Cursor = Cursors.Default
    End Try
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top