Как вставить дату в реляционную базу данных Oracle с помощью С#

У меня есть Date Var в Oracle, и я пытаюсь вставить данные из своей программы на С#

sql = "insert into Table(MyDate) values (" + convert.todatetime(txt) + ")";

Я получаю ошибку, что я могу сделать?


person Gold    schedule 30.03.2009    source источник
comment
Пожалуйста, также опубликуйте текст фактической ошибки, иначе вам будет сложно помочь.   -  person David Schmitt    schedule 30.03.2009
comment
1. Какую ошибку вы получаете? 2. Каково значение txt. 3. Почему вы конвертируете строку txt в DateTime только для того, чтобы снова преобразовать ее в строку? 4. Формат по умолчанию для DateTime, вероятно, не является правильным форматом для анализа Oracle, вам может потребоваться использовать .ToString() для DateTime, чтобы получить его в правильном формате.   -  person Paul Ruane    schedule 30.03.2009


Ответы (7)


Используйте параметры. Это решит вашу проблему и предотвратит инъекцию.

person Otávio Décio    schedule 30.03.2009
comment
Вместо того, чтобы просто говорить об этом, следует показать пример с использованием кода ОП. - person vapcguy; 05.10.2016
comment
Я не понимаю, почему этот ответ получил так много голосов. Это должен быть комментарий, потому что он не показывает код и не объясняет возможный подход. - person Patrick L; 10.03.2017

Oracle ожидает, что это будет фактическое значение даты, а не просто строка, которая выглядит как дата. Вы должны использовать функцию TO_DATE(), чтобы объяснить, как отформатирована ваша строка, примерно так:

INSERT INTO Table (myDate)
VALUES(TO_DATE('2009-03-30 12:30:00', 'YYYY-MM-DD HH:mi:ss'));
person Chad Birch    schedule 30.03.2009
comment
Это не совсем так. Если вы вставите дату в формате ДД-МММ-ГГГГ, Oracle (не менее 10 г) примет ее как есть. - person Harper Shelby; 30.03.2009

Попробуйте использовать DateTime.TryParse(текст) или DateTime.Parse(текст)

person jle    schedule 30.03.2009
comment
Само по себе это не сработает - по крайней мере, для меня. Я сделал 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
comment
На самом деле, нет, я был неправ. 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
person EnterTheBlackDragon    schedule 06.03.2019

Пожалуйста, привяжите свои переменные (как говорит ocdecio)! Это не только предотвращает инъекции sql, но и намного быстрее. Особенно в ситуации множественного параллелизма. Например, читайте здесь: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#CEGCGDAB .

«Переменные связывания — это заполнители внутри оператора SQL. Когда база данных получает оператор SQL, она определяет, был ли оператор уже выполнен и сохранен в памяти. Если оператор действительно существует в памяти, Oracle Database может повторно использовать его и пропустить задачу синтаксический анализ и оптимизация оператора. Использование переменных связывания позволяет повторно использовать оператор с различными входными значениями. Использование переменных связывания также повышает производительность запросов в базе данных, устраняет необходимость в специальной обработке буквенных кавычек во входных данных, и защищает от атак SQL-инъекций».

person tuinstoel    schedule 30.03.2009
comment
заголовок был о том, как вставить дату - person Amir; 03.05.2021

Я знаю, что это был плохо заданный вопрос, но я видел несколько плохих ответов, когда у меня был тот же вопрос, и столкнулся с этим. Вот как я это решил, и я отвечу, используя контекст ОП:

Разберите дату в переменную 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, однако, лучше всего и самый легкий.

person vapcguy    schedule 05.10.2016

person    schedule
comment
Я думаю, что OracleType должно быть OracleDbType, и я думаю, что .DateTime должно быть .Date. У меня нет OracleType.DateTime в моем intellisense с использованием Oracle 12c DLL ODP для .NET, клиентская сборка Oracle.ManagedDataAccess.dll версии 4.121.2. - person vapcguy; 04.10.2016
comment
Кроме того, вы не ставите : на имя OracleParameter, когда добавляете его. ОП также пытался использовать точную дату (txt), а не DateTime.Now. Это не отвечает на этот вопрос. - person vapcguy; 05.10.2016