2012-06-12 2 views
1

시간을내어보고 도와 주셔서 감사합니다. 나는 아주 쉬운 삽입 작업 인 것처럼 보이지만,이 부분을 통과하지 못하는 것 같아서 너 자신을 몰고 간다. 여기에 내가 코드를 가지고 무엇을 : 나는이 'DATE'형식 필드 REQUESTDATE 및 COMPLETION_DATE를 제외하고 작업 모든 것을 얻을 수 있었다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(); 
     } 

    } 

. ExecuteNonQuery() 호출이 예외를 throw 할 때 예외를 제외하고 내가 무엇을하고 있는지 알지 못합니다.

누구나 제안 사항이 있으면 정말 감사하겠습니다. 당신은 아마 OracleType.DateTime을 사용하고 입력 문자열을 파싱하여 생성 날짜 시간 값, 예를 전달하려는 날짜 필드에 대한

+1

예외는 무엇입니까? 또한 Oracle에서 동일한 입력으로 쿼리를 실행하면 실행됩니까? –

+0

ORA-01740 : 식별자에 큰 따옴표가 누락되었습니다. 편집 : 이제 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

는 :

조 위에서 말한 외에도
AddWithValue("CompletedBy", OracleType.DateTime).Value = 
       DateTime.ParseExact(...CompletedByTB.Text...); 
0

, 나는 몇 가지를 발견 사물 : -

a) 예외가 발생하면 트랜잭션을 열지 만 롤백하지 않습니다. try catch 문으로 이것을 둘러싸고 예외가 발생하면 트랜잭션을 롤백하고, 그렇지 않으면 커밋 할 수 있습니다.

b) 항상 연결 개체를 사용하여 블록을 사용해야합니다 (질문에서 방금 코드를 편집했습니다). 그렇게하면 명시 적으로 연결을 닫고 처리 할 필요가 없습니다. 이는 모든 연결 제공자 유형 (OracleConnection 포함)이 기본 클래스 "DbConnection"을 통해 IDisposable 인터페이스를 구현하기 때문입니다.

+0

저를 위해 편집 해 주셔서 감사합니다. 내가 그것에 대해 생각할 때마다 총체적인 의미를가집니다. Joe의 솔루션을 시도하고 결과를 게시합니다. –

+1

"try catch 문으로 이것을 닫고 예외가 발생했을 때 트랜잭션을 롤백하고 그렇지 않으면 커밋 할 수 있습니다."또는 더 간결하게 using 블록에 넣습니다 (Dispose는 커밋되지 않은 트랜잭션을 롤백합니다) . – Joe

관련 문제