I have difficulties trying to insert rows into an existing table object. Here is my code snippet:
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"C:\myExcelFile.xlsx" + ";Extended Properties=\"Excel 12.0;ReadOnly=False;HDR=Yes;\"";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
string insertQuery = String.Format("Insert into [{0}$] (ID, Title,NTV_DB, Type ) values(7959, 8,'e','Type1')", TabDisplayName);
cmd.CommandText = insertQuery;
cmd.ExecuteNonQuery();
cmd = null;
conn.Close();
}
As a result I get my rows inserted below a ready-made table object:
I've also tried inserting data inside a table object like so:
string insertQuery = String.Format("Insert into [{0}$].[MyTable] (ID, Title,NTV_DB, Type ) values(7959, 8,'e','Type1')", TabDisplayName);
But I get an error:
The Microsoft Access database engine could not find the object 'MyTable'. Make sure the object exists and that you spell its name and the path name correctly. If 'MyTable' is not a local object, check your network connection or contact the server administrator.
As you can see, table with a name MyTable
does exist. I would be very grateful if someone can shed some light on this mystery.
If you are using the
Microsoft.ACE.OLEDB
provider, then be aware that it doesn't support a named range. You need to provide the name of the sheet[Sheet1$]
or the name of the sheet followed by the range[Sheet1$A1:P7928]
. If the range is not provided, it will then define the table as the used range, which may contains empty rows.One way to deal with empty rows would be to delete them, but the driver doesn't support the
DELETE
operation.Another way is to first count the number of rows with a non empty
Id
and then use the result to define the range of the table for theINSERT
statement:Try this
If you execute this code:
you will see 7938 (last row number on your screenshot). And when you insert new row, it inserted at 7939 position. Empty content in (7929, 7930, ...) rows are ignored, because excel knows that last number is 7938.
Solutions:
I'm not sure Access C# works the same as Excel, but this worked on a spreadsheet for me. Maybe it could help you?