2012-06-12 6 views
1

Спасибо, что нашли время посмотреть и помочь мне. Я вовлекаю себя в орехи с тем, что кажется очень простой вставкой, но я не могу передать эту часть. Вот что у меня есть для кода:OracleCommand.ExecuteNonQuery() throwing exception

protected void InsertIntoMaterialDB() 
    { 
     ToroGeneral toro = new ToroGeneral(); 

     // Grab connection string. 
     string conString = toro.GetOracle1ConnectionString(); 
     string insertQuery = "INSERT INTO MATERIALMOVEREQUEST (ORIGINATOR, REQUESTDATE, PARTNUMBER, REQUESTQTY, MOVEFROM, MOVETO, COMPLETEDBY, COMPLETION_DATE, COMMENTS, RESPONSETIME) " 
           + "values (:Originator, :RequestDate, :PartNumber, :RequestQty, :MoveFrom, :MoveTo, :CompletedBy, :CompletionDate, :ResponseTime, :Comments)"; 

     using(OracleConnection conn1 = new OracleConnection(conString)) 
     {  
      conn1.Open(); 
      OracleCommand cmd = conn1.CreateCommand(); 
      OracleTransaction myTrans; 
      cmd.CommandText = insertQuery; 
      myTrans = conn1.BeginTransaction(IsolationLevel.ReadCommitted); 
      cmd.Transaction = myTrans; 

      if (cmd.Connection.State == ConnectionState.Closed) 
      { 
        cmd.Connection.Open(); 
      } 

      DateTime rDate = DateTime.Parse(RequestDateTB.Text); 
      DateTime cDate = DateTime.Parse(CompDateTB.Text); 

      cmd.Parameters.AddWithValue("Originator", OracleType.VarChar).Value = OriginatorTB.Text; 
      cmd.Parameters.AddWithValue("RequestDate", OracleType.DateTime).Value = rDate; 
      cmd.Parameters.AddWithValue("PartNumber", OracleType.VarChar).Value = PartNumber.Text; 
      cmd.Parameters.AddWithValue("RequestQty", OracleType.Number).Value = Convert.ToInt32(RequestQuantity.Text); 
      cmd.Parameters.AddWithValue("MoveFrom", OracleType.VarChar).Value = MoveFromTB.Text; 
      cmd.Parameters.AddWithValue("MoveTo", OracleType.VarChar).Value = MoveToTB.Text; 
      cmd.Parameters.AddWithValue("CompletedBy", OracleType.VarChar).Value = CompletedByTB.Text; 
      cmd.Parameters.AddWithValue("CompletionDate", OracleType.DateTime).Value = cDate; 
      cmd.Parameters.AddWithValue("ResponseTime", OracleType.Number).Value = Convert.ToInt32(RespTimeTB.Text); 
      cmd.Parameters.AddWithValue("Comments", OracleType.VarChar).Value = CommentsTB.Text; 

      cmd.ExecuteNonQuery(); // THIS THROWS AN EXCEPTION. 
      cmd.Transaction.Commit(); 
     } 

    } 

Я был в состоянии получить все, работая на два «DATE» полей типа REQUESTDATE и COMPLETION_DATE исключения. Я не знаю, что я делаю неправильно, за исключением того, что при вызове ExecuteNonQuery() он генерирует исключение.

Если у кого-то есть предложения, это было бы очень признательно.

+1

В чем исключение? Кроме того, если вы выполняете запрос с одинаковыми входами в Oracle, выполняет ли это выполнение? –

+0

ORA-01740: отсутствующая двойная кавычка в идентификаторе EDIT: Я думаю, что в моем заявлении INSERT мне не хватает «" или '', когда я думаю об этом. –

+0

ORA-01843: недействительный месяц, указывая на: RequestDate –

ответ

2

Я столкнулся с подобной проблемой в прошлом. Используйте функцию To_Date для преобразования строки в дату, которую распознает оракул.

INSERT INTO MATERIALMOVEREQUEST (ORIGINATOR, REQUESTDATE, PARTNUMBER, REQUESTQTY, MOVEFROM, MOVETO, COMPLETEDBY, COMPLETION_DATE, COMMENTS, RESPONSETIME) " 
          + "values (:Originator, To_Date(:RequestDate, 'YYYY-MM-DD-HH24:MI:SS'), :PartNumber, :RequestQty, :MoveFrom, :MoveTo, :CompletedBy, To_Date(:CompletionDate, 'YYYY-MM-DD-HH24:MI:SS'), :ResponseTime, :Comments)"; 

Затем в ваших параметрах задайте значение для строки.

cmd.Parameters.AddWithValue("RequestDate", OracleType.VarChar).Value = rDate.ToString("yyyy-MM-dd-hh:mm:ss"); 
+0

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

+0

Я бы подумал, что пользователь, имеющий права манипулировать данными, может нанести гораздо больший урон, чем пользователь, чтобы изменить права доступа к сеансу в базе данных. Изменение сеанса продолжается только до тех пор, пока активна связь с базой данных. При подключении к базе данных через Benthic (или ваш инструмент выбора) вы можете установить формат даты, в котором используется команда alter session. – bwalk2895

+0

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:77552825928548 Это всего лишь одно место, которое советует как таковое. Есть еще много ..... – tsells

1

Для полей дат, вероятно, хотите использовать OracleType.DateTime и передать значение DateTime, генерируемую путем разбора входной строки, например:

AddWithValue("CompletedBy", OracleType.DateTime).Value = 
       DateTime.ParseExact(...CompletedByTB.Text...); 
0

В дополнение к тому, что было сказано выше Джо, я заметил пару вещи: -

a) Вы открываете транзакцию, но не откатываете ее в случае каких-либо исключений. Вы можете включить это с помощью инструкции try catch и отменить транзакцию в случае исключения и зафиксировать в противном случае.

b) Вы всегда должны использовать блок использования вокруг объектов соединения (я только что редактировал ваш код в вопросе). Таким образом, вам не нужно закрывать и удалять соединение явно. Это связано с тем, что все типы провайдеров соединений (включая OracleConnection) реализуют интерфейс IDisposable через свой базовый класс «DbConnection».

+0

Спасибо, что редактировал это для меня. Теперь я чувствую полный смысл, когда думаю об этом. Я попробую решение Джо и опубликую свои результаты. –

+1

«Возможно, вы захотите заключить это с помощью инструкции try catch и отменить транзакцию в случае исключения и зафиксировать в противном случае» - или более кратко, поместить ее в блок использования (Dispose откатит транзакцию, если она не была выполнена) , – Joe