Приведение .NET DateTime к OracleDate - PullRequest
3 голосов
/ 01 сентября 2011

Я пытаюсь вставить значение .NET DateTime в столбец Oracle DATE, используя ODP.NET.До сих пор я пытался использовать конструктор OracleDate () для приведения .NET DateTime следующим образом:

new OracleDate(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTimeNow.Hour, DateTime.Now.Minute, DateTime.Now.Second)

Когда я пытаюсь это сделать, он вставляет в столбец правильный год, месяц и день, новремя всегда установлено в полночь.Как вставить правильное время вместе с датой?

Без параметров SQL выглядит следующим образом (DateTime.Now используется для ясности, в противном случае я бы просто использовал SYSDATE):

"update mytable set timestamp = '" + new OracleTimeStamp(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTimeNow.Second) + "'"

Ответы [ 2 ]

4 голосов
/ 01 сентября 2011

Вы должны использовать параметры для этого.Также нет необходимости использовать типы данных, специфичные для Oracle, когда подходит эквивалентный тип данных .NET.Это позволяет упростить замену ODP.NET на другой драйвер позднее, так как большинство других драйверов работают с собственными типами данных .NET.

using (OracleConnection conn = new OracleConnection("your connection string here")
{
    string query = "update mytable set timestamp = :foo";

    using (OracleCommand cmd = new OracleCommand(query, conn))
    {
        cmd.Parameters.Add(":foo", DateTime.Now);

        cmd.ExecuteNonQuery();
    }
}
4 голосов
/ 01 сентября 2011

Согласно это вы должны использовать OracleTimeStamp как OracleDbType для достижения того, что вы хотите ...

OracleDate без временной части ... это поведение началось когда-тоназад (IIRC Oracle 8 или около того) с драйверами JDBC ... с драйверами JDBC был / есть какой-то странный обходной путь, который я сейчас не помню ... Я не знаю, есть ли обходной путь для ODP.NET ... OracleTimeStamp - официально поддерживаемый способ для дат с частями времени ...

EDIT - после того, как OP добавил оператор SQL:

Прежде всего, это утверждение содержит две проблемы - никогда не называйте столбец / таблицу как зарезервированное слово (т. Е. timestamp) ... другая проблема - отсутствие использования параметра, который в этом случае выиграл 'не приводит к внедрению SQL, но все еще является плохой практикой и приводит (если этот же оператор используется несколько раз) к минимальной потере производительности ...

ЕСЛИ вы все еще хотите использовать его таким образом, ТОГДА это будет работать:

"update mytable set timestamp = TO_DATE ('" + DateTime.Now.ToString ("yyyyMMddHHmmss") + "', 'YYYYMMDDHH24MISS')";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...