簡體   English   中英

OracleCommand.ExecuteNonQuery()拋出異常

[英]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()調用它會拋出異常。

如果有人有任何建議,將非常感激。

我過去遇到過類似的問題。 使用To_Date函數將字符串轉換為oracle將識別的日期。

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");

對於Date字段,您可能希望使用OracleType.DateTime並傳遞通過解析輸入字符串生成的DateTime值,例如:

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

除了Joe上面所說的,我還注意到了幾件事:

a)您正在打開一個事務,但在發生任何異常時永遠不會回滾它。 您可能希望使用try catch語句將其括起來,並在異常情況下回滾事務,否則提交。

b)你應該總是在連接對象周圍使用using塊(我剛剛在問題中編輯了你的代碼)。 這樣您就不必顯式關閉和處理連接。 這是因為所有連接提供程序類型(包括OracleConnection)都通過其基類“DbConnection”實現IDisposable接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM