Excel Jet OLE DB: Einfügen eines DateTime-Wert
OLEDB verwendet werden können, um Lesen und schreiben von Excel-sheets. Betrachten Sie den folgenden code Beispiel:
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\my\\excel\\file.xls;Extended Properties='Excel 8.0;HDR=Yes'")) {
conn.Open();
OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] datetime)", conn);
cmd.ExecuteNonQuery();
cmd = new OleDbCommand("INSERT INTO Sheet1 VALUES (@mydate)", conn);
cmd.Parameters.AddWithValue("@mydate", DateTime.Now.Date);
cmd.ExecuteNonQuery();
}
Dieser funktioniert einwandfrei in Ordnung. Einfügen von zahlen, text, etc. funktioniert auch gut. Jedoch, einfügen eines Wertes mit einer Komponente ausfällt:
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\my\\excel\\file.xls;Extended Properties='Excel 8.0;HDR=Yes'")) {
conn.Open();
OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] datetime)", conn);
cmd.ExecuteNonQuery();
cmd = new OleDbCommand("INSERT INTO Sheet1 VALUES (@mydate)", conn);
cmd.Parameters.AddWithValue("@mydate", DateTime.Now); //<-- note the difference here
cmd.ExecuteNonQuery();
}
Ausführen, schlägt das EINFÜGEN fehl mit eine OleDbException: Data type mismatch in criteria expression.
Ist dies ein bekannter bug? Wenn ja, was kann getan werden, um Abhilfe es? Ich habe eine Lösung gefunden, die funktioniert:
cmd = new OleDbCommand(String.Format(@"INSERT INTO Sheet1 VALUES (#{0:dd\/MM\/yyyy HH:mm:ss}#)", DateTime.Now), conn);
Es schafft im Grunde eine SQL-Anweisung, die wie folgt aussieht: INSERT INTO Sheet1 VALUES (#05/29/2011 13:12:01#)
. Natürlich, ich habe nicht, Ihnen zu sagen, wie hässlich das ist. Ich würde viel lieber eine Lösung über eine parametrisierte Abfrage.
- In der Vergangenheit habe ich nicht die Mühe mit ihm, und nur eingefügt DateTime.Nun.ToString().
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es ein bekannter bug https://connect.microsoft.com/VisualStudio/feedback/details/94377/oledbparameter-with-dbtype-datetime-throws-data-type-mismatch-in-criteria-expression
Möchten Sie vielleicht abschneiden der Millisekunde, wie diese es scheint, die Arbeit für OleDbParameter:
Hinzufügen und diese statt dem DateTime.Jetzt in Ihre parameter-Wert.
Das problem ist die Zelle mit datetime-Wert nicht direkt in excel' - Spalte. Sie haben entweder das Datum einfügen-Komponente oder der Komponente. Der Grund für den Ausfall ist die Standard-Eigenschaft von excel-Zelle ist, "Werte" statt "datetime" in excel.