Глядя на тег .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 необходимо решить аналогичную проблему, и я был бы удивлен, если бы он не делал то же самое.