Schreiben, um mit OleDb zu übertreffen
Ich versuche, Datenzeilen von SQL nach Excel zu exportieren, aber mein Einfügebefehl scheint jedes Mal zu scheitern. Ich habe viel Zeit damit verbracht, dies zu schaffen, aber ich bin endlich gegen die Wand gelaufen.
Das Excel-Dokument wird vom IRS generiert, und wir dürfen nichts über Zeile 16 ändern. Zeile 16 ist die Kopfzeile, und alles darunter müssen die Daten von SQL sein. Die Kopfzeilennamen enthalten alle Leerzeichen, und das scheint der Punkt zu sein, an dem ich auf Schwierigkeiten stoße.
Ab Zeile 16 lauten die Spaltennamen: Vorname des Teilnehmers, Nachname des Teilnehmers, PTIN-Nummer des Teilnehmers, Programmnummer, zuerkanntes CE-Stundenprogramm, Abschlussdatum
So versuche ich zu schreiben, um zu übertreffen
private void GenerateReport()
{
FileInfo xlsFileInfo = new FileInfo(Server.MapPath(CE_REPORTS_PATH + CE_PTIN_TEMPLATE + EXTENSION));
string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes'", xlsFileInfo.FullName);
//create connection
OleDbConnection oleDBConnection = new OleDbConnection(connectionString);
oleDBConnection.Open();
//create the adapter with the select to get
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$A16:F16]", oleDBConnection);
// Create the dataset and fill it by using the adapter.
DataTable dataTable = new DataTable();
adapter.FillSchema(dataTable, SchemaType.Source);
adapter.Fill(dataTable);
string[] colNames = new string[dataTable.Columns.Count];
string[] colParms = new string[dataTable.Columns.Count];
for (int i = 0; i < dataTable.Columns.Count; i++)
{
colNames[i] = String.Format("[{0}]", dataTable.Columns[i].ColumnName);
colParms[i] = "?";
}
// Create Insert Command
adapter.InsertCommand = new OleDbCommand(String.Format("INSERT INTO [Sheet1$] ({0}) values ({1})", string.Join(",", colNames), string.Join(",", colParms)), oleDBConnection);
// Create Paramaters
for (int i = 0; i < dataTable.Columns.Count; i++)
{
OleDbParameter param = new OleDbParameter(String.Format("@[{0}]", dataTable.Columns[i].ColumnName), OleDbType.Char, 255, dataTable.Columns[i].ColumnName);
adapter.InsertCommand.Parameters.Add(param);
}
// create a new row
DataRow newCERecord = dataTable.NewRow();
// populate row with test data
for (int i = 0; i < dataTable.Columns.Count; i++)
{
newCERecord[i] = "new Data";
}
dataTable.Rows.Add(newCERecord);
// Call update on the adapter to save all the changes to the dataset
adapter.Update(dataTable);
oleDBConnection.Close();
}
Der Fehler, den ich erhalte, tritt auf, wenn adapter.Update (dataTable) aufgerufen wird und lautet wie folgt
$exception {"The INSERT INTO statement contains the following unknown field name: 'Attendee First Name'. Make sure you have typed the name correctly, and try the operation again."} System.Exception {System.Data.OleDb.OleDbException}
Dies ist frustrierend, da ich jedes Feld direkt aus dem Spaltennamen ziehe, wie er von colNames [i] = String.Format ("[{0}]", dataTable.Columns [i] .ColumnName) abgerufen wurde. Ich entdeckte, dass ich das [] brauchte, um die Leerzeichen in den Spaltennamen zu berücksichtigen, aber an diesem Punkt bin ich mir nicht sicher, was das Problem ist. Wenn ich mir die Excel-Datei ansehe, erscheint mir alles richtig.