Excel Jet OLE DB: вставка значения DateTime - PullRequest
1 голос
/ 06 июня 2011

OLEDB может использоваться для чтения и записи листов Excel. Рассмотрим следующий пример кода:

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();
}

Это прекрасно работает. Вставка чисел, текста и т. Д. Также работает хорошо. Однако вставить значение с компонентом времени не удается:

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();
}

Выполнение этой вставки завершается с ошибкой OleDbException: Несоответствие типов данных в выражении критериев.

Это известная ошибка? Если да, что можно сделать, чтобы обойти это? Я нашел один обходной путь, который работает:

cmd = new OleDbCommand(String.Format(@"INSERT INTO Sheet1 VALUES (#{0:dd\/MM\/yyyy HH:mm:ss}#)", DateTime.Now), conn);

Он в основном создает инструкцию SQL, которая выглядит следующим образом: INSERT INTO Sheet1 VALUES (#05/29/2011 13:12:01#). Конечно, мне не нужно говорить вам, насколько это ужасно. Я бы предпочел иметь решение с параметризованным запросом.

Ответы [ 2 ]

4 голосов
/ 07 июня 2011

Кажется, это известная ошибка https://connect.microsoft.com/VisualStudio/feedback/details/94377/oledbparameter-with-dbtype-datetime-throws-data-type-mismatch-in-criteria-expression

Возможно, вы захотите усечь миллисекунду, как это работает для OleDbParameter:

DateTime org = DateTime.UtcNow;
DateTime truncatedDateTime = new DateTime(org.Year, org.Month, org.Day, org.Hour, org.Minute, org.Second);

И добавьте это вместоDateTime.Now в значение вашего параметра.

1 голос
/ 21 января 2014

Проблема в том, что ячейка, содержащая значение datetime, не может быть напрямую помещена в столбец excel. Вы должны либо вставить компонент даты, либо компонент времени. Причиной сбоя является свойство по умолчанию для ячейки Excel '- это "значения" вместо "datetime" в Excel.

...