Fügen Sie DataTable mithilfe von Microsoft Access Database Engine über OleDb in Excel ein
Ich bin heute auf Anweisungen zum Lesen von Daten aus einer Microsoft Excel-Datei mit einem gestoßenOleDbConnection
auf dieser website:OLE DB-Anbieter
Dadurch kann ich alle Daten aus einer Excel-Datei einlesen:
private const string EXCEL_CON =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};" +
@"Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
public DataTable ExtractExcel(string fullFilename, string tableName)
{
var table = new DataTable();
string strCon = string.Format(EXCEL_CON, fullFilename);
using (var xlConn = new System.Data.OleDb.OleDbConnection(strCon))
{
ConnectionState initialState = xlConn.State;
try
{
if ((initialState & ConnectionState.Open) != ConnectionState.Open)
{
xlConn.Open();
}
string sql = string.Format("SELECT * FROM `{0}`;", tableName);
using (var cmd = new System.Data.OleDb.OleDbCommand(sql, xlConn))
{
table.Load(cmd.ExecuteReader());
}
}
finally
{ // it seems like Access does not always close the connection
if ((initialState & ConnectionState.Open) != ConnectionState.Open)
{
xlConn.Close();
}
}
}
return table;
}
Beim Einfügen von Daten wird in Schritt 1 die vorhandene Tabelle in der Microsoft Access-Datenbank weggeblasen, falls Spalten hinzugefügt, geändert oder entfernt wurden:
public void InsertExcel(OleDbConnection dbConn, DataTable table) {
ConnectionState initState = dbConn.State;
try {
if ((initState & ConnectionState.Open) != ConnectionState.Open) {
dbConn.Open();
}
string sql = string.Format("SELECT * FROM {0};", table.TableName);
DataTable original = new DataTable();
using (OleDbCommand cmd = new OleDbCommand(sql, dbConn)) {
try {
original.Load(cmd.ExecuteReader());
} catch (Exception) { // table does not exist
}
}
if (0 < original.Rows.Count) {
sql = string.Format("DROP TABLE {0};", table.TableName);
using (OleDbCommand cmd = new OleDbCommand(sql, dbConn)) {
cmd.ExecuteNonQuery();
}
}
// ****************
// CODE NEEDED HERE
// ****************
} finally {
if ((initState & ConnectionState.Open) != ConnectionState.Open) {
dbConn.Close();
}
}
}
Nach demDROP TABLE
Befehl wird ausgeführt (imCODE NEEDED HERE
abschnitt) muss ich irgendwie die informationen in die einfügenDatentabelle.
Wie füge ich die Tabelle ein, wenn ich keinen Primärschlüssel, Spaltennamen oder Spaltendatentyp habe?
DasOleDbParameter hat hat dieAddWithValue Methode, mit der Daten hinzugefügt werden können, ohne dass der Datentyp bekannt sein muss.Gibt es etwas Ähnliches, das ich verwenden könnte, um das Ganze zu entsorgen?DataTable
(oderDataSet
)?