Как вставить дату с ггггммддHH24miss для даты тип данных в оракуле - PullRequest
0 голосов
/ 30 октября 2018

Я вставляю в одну таблицу, называемую testtable, где APPLICATION_DATE столбец. Я вставляю дату, но получаю ошибку как недопустимый месяц. Как ее исправить. *

insert into testtable(APPLICATION_DATE) VALUES(TO_DATE('20180118165335','mm/dd/yyyy'));

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Глядя на тег .Net на вопрос. Если вы используете .Net и беспокоитесь о форматировании строкового значения для использования в SQL, вы идете об этом очень неправильно. Не ясно, используете ли вы ODP.Net или OracleClient, но либо Для этого вам нужно сначала проанализировать значение в объекте .Net DateTime. Предполагается, что C #, но код VB.Net не очень отличается:

string input = "20180118165335";
DateTime output = DateTime.ParseExact(input, "yyyyMMddHHmmss", CultureInfo.InvariantCulture));

Получив значение DateTime, вы строите строку SQL следующим образом:

string sql = "INSERT INTO testtable(APPLICATION_DATE) VALUES ( :AppDate );";

Обратите внимание, насколько проста эта строка. Нет конверсий. Не беспокойтесь о формате. Нет конкатенации. Просто заполнитель.

Затем вы используете эти две переменные следующим образом:

using (var cn = new OracleConnection("connection string here"))
using (var cmd  new OracleCommand(sql, cn))
{
    cmd.BindByName = true;
    cmd.Parameters.Add(":AppDate", OracleDbType.Date).Value = output;
    cn.Open();
    cmd.ExecuteNonQuery();
}

Важной особенностью этого примера является значение output, равное , никогда , подставляемое непосредственно в текст команды SQL, даже на сервере. Это предотвращает любую возможность атак SQL-инъекций. Кроме того, использование параметров запроса таким образом обеспечивает правильное преобразование в значение Oracle Date, не беспокоясь о беспорядочных форматах.

Это также имеет тенденцию работать лучше, потому что теперь сервер базы данных может кэшировать план выполнения. Обычно мы говорим об этом применительно к Sql Server, но Oracle необходимо решить аналогичную проблему, и я был бы удивлен, если бы он не делал то же самое.

0 голосов
/ 30 октября 2018

Если введено значение 20180118165335, тогда маска формата должна выглядеть как

insert into testtable(APPLICATION_DATE) VALUES(TO_DATE('20180118165335','yyyymmddhh24miss'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...