У меня есть Date Var в Oracle, и я пытаюсь вставить данные из своей программы на С#
sql = "insert into Table(MyDate) values (" + convert.todatetime(txt) + ")";
Я получаю ошибку, что я могу сделать?
У меня есть Date Var в Oracle, и я пытаюсь вставить данные из своей программы на С#
sql = "insert into Table(MyDate) values (" + convert.todatetime(txt) + ")";
Я получаю ошибку, что я могу сделать?
Используйте параметры. Это решит вашу проблему и предотвратит инъекцию.
Oracle ожидает, что это будет фактическое значение даты, а не просто строка, которая выглядит как дата. Вы должны использовать функцию TO_DATE()
, чтобы объяснить, как отформатирована ваша строка, примерно так:
INSERT INTO Table (myDate)
VALUES(TO_DATE('2009-03-30 12:30:00', 'YYYY-MM-DD HH:mi:ss'));
Попробуйте использовать DateTime.TryParse(текст) или DateTime.Parse(текст)
DateTime myDate = DateTime.Parse("1/1/1900");
и отправил это в OracleParameter: OraCommand.Parameters.Add("@"+fieldName, OracleDbType.Date).Value = myDate;
- получил ORA-01840: input value not long enough for date format\nORA-06512: at line 1
. Нужно нечто большее, чем просто это.
- person vapcguy; 04.10.2016
DateTime.Parse("1/1/1900");
был в порядке, как и мой OracleParameter
. Я бы удалил свой предыдущий комментарий, но на самом деле это может кому-то помочь: на самом деле моя проблема заключалась в том, что мои параметры в моей хранимой процедуре были не в том порядке, в котором я отправлял их в своем С#, поэтому то, что я думал, было установлено для моего Поле даты действительно записывалось в другой входной параметр в моей хранимой процедуре и устанавливалось в другое поле. Мое поле даты получало только пустую строку из значения другого входного параметра вместо проанализированной даты. Мораль: проверьте порядок.
- person vapcguy; 05.10.2016
Самый простой способ:
DateTime inputDate = Convert.ToDateTime("01/01/2019"); //<---Input Sample Date in format
string queryParameters = String.Format("SELECT * FROM TABLE WHERE DATE = '{0}')", inputDate.ToString("dd-MMM-yyyy")); //<-- Converts System.DateTime into Oracle DateTime
//Forget looking anywhere else for an answer, copy and paste and reform this very code
//and see the results
Пожалуйста, привяжите свои переменные (как говорит ocdecio)! Это не только предотвращает инъекции sql, но и намного быстрее. Особенно в ситуации множественного параллелизма. Например, читайте здесь: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#CEGCGDAB .
«Переменные связывания — это заполнители внутри оператора SQL. Когда база данных получает оператор SQL, она определяет, был ли оператор уже выполнен и сохранен в памяти. Если оператор действительно существует в памяти, Oracle Database может повторно использовать его и пропустить задачу синтаксический анализ и оптимизация оператора. Использование переменных связывания позволяет повторно использовать оператор с различными входными значениями. Использование переменных связывания также повышает производительность запросов в базе данных, устраняет необходимость в специальной обработке буквенных кавычек во входных данных, и защищает от атак SQL-инъекций».
Я знаю, что это был плохо заданный вопрос, но я видел несколько плохих ответов, когда у меня был тот же вопрос, и столкнулся с этим. Вот как я это решил, и я отвечу, используя контекст ОП:
Разберите дату в переменную DateTime
:
DateTime myDate = DateTime.Parse(txt);
Затем параметризуйте свой запрос:
sql = "insert into Table(MyDate) values (:myDate)";
Настройте OracleParameter
:
OracleParameter param = new OracleParameter();
param.ParameterName = "myDate";
param.OracleDbType = OracleDbType.Date;
param.Value = myDate;
Предполагая, что у вас уже есть OracleConnection
как connection
, настройте свою команду и добавьте свой параметр:
OracleCommand cmd = new OracleCommand(sql, connection);
cmd.Parameters.Add(param);
Выполнять:
cmd.ExecuteNonQuery();
НЕ тратьте свое время на всякую TO_DATE
ерунду. Это нужно для случаев, когда вы добавляете что-то непосредственно с помощью SQL*Plus или Oracle SQL Developer, или МОЖЕТ БЫТЬ, когда вы хотите отправить значение переменной STRING (не переменной DateTime) в ТОЧНОМ формате, который ожидает TO_DATE
и который вы назначаете в TO_DATE
построить в вашем запросе или хранимой процедуре (например, to_date('2013-05-13 12:13:14', 'YYYY-MM-DD HH24:MI:SS')
. Использование переменной DateTime
и назначение ее OracleParameter
с OracleDbType
из OracleDbType.Date
, при условии, что у вас есть поле DATE
в вашей таблице и вы можете проанализировать txt
в переменную DateTime
, однако, лучше всего и самый легкий.
OracleType
должно быть OracleDbType
, и я думаю, что .DateTime
должно быть .Date
. У меня нет OracleType.DateTime
в моем intellisense с использованием Oracle 12c DLL ODP для .NET, клиентская сборка Oracle.ManagedDataAccess.dll версии 4.121.2.
- person vapcguy; 04.10.2016
:
на имя OracleParameter
, когда добавляете его. ОП также пытался использовать точную дату (txt
), а не DateTime.Now. Это не отвечает на этот вопрос.
- person vapcguy; 05.10.2016