Как вставить дату в реляционную базу данных Oracle с помощью C # - PullRequest
0 голосов
/ 30 марта 2009

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

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

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

Ответы [ 7 ]

10 голосов
/ 30 марта 2009
cmd.CommandText = "INSERT INTO Table (myDate)VALUES(:dateParam)";

cmd.Parameters.Add(new OracleParameter("dateParam", OracleDbType.Date))
    .Value = DateTime.Now;

cmd.ExecuteNonQuery();
8 голосов
/ 30 марта 2009

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

5 голосов
/ 30 марта 2009

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

INSERT INTO Table (myDate)
VALUES(TO_DATE('2009-03-30 12:30:00', 'YYYY-MM-DD HH:mi:ss'));
1 голос
/ 30 марта 2009

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

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

1 голос
/ 30 марта 2009

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

0 голосов
/ 06 марта 2019

Самый простой способ:

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
0 голосов
/ 05 октября 2016

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

Разобрать дату в 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);

Execute:

cmd.ExecuteNonQuery();

Не НЕ тратить свое время на любую чушь TO_DATE. Это для случаев, когда вы добавляете что-либо непосредственно с использованием SQL * Plus или Oracle SQL Developer, или MAYBE, куда вы хотите отправить значение переменной STRING (а не переменную DateTime) в формате EXACT, ожидаемом 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, однако, это лучший и самый простой.

...