1

時間を割いて私を助けてくれてありがとう。非常に簡単な挿入操作のように思えますが、この部分を通過できないようです。これが私がコードのために持っているものです:

 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();
        }

    }

2つの「DATE」型フィールドREQUESTDATEとCOMPLETION_DATEを除いて、すべてを機能させることができました。ExecuteNonQuery()呼び出しに到達すると例外がスローされることを除いて、何が間違っているのかわかりません。

誰かが何か提案があれば、それは本当にありがたいです。

4

3 に答える 3

2

私は過去に同様の問題に遭遇しました。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");
于 2012-06-12T19:52:54.780 に答える
1

おそらく使用したい日付フィールドの場合OracleType.DateTime、入力文字列を解析して生成したDateTime値を渡します。例:

AddWithValue("CompletedBy", OracleType.DateTime).Value = 
              DateTime.ParseExact(...CompletedByTB.Text...); 
于 2012-06-12T17:21:26.117 に答える
0

ジョーが上で言ったことに加えて、私はいくつかのことに気づきました:-

a)トランザクションを開いていますが、例外が発生した場合にロールバックすることはありません。これをtrycatchステートメントで囲み、例外が発生した場合はトランザクションをロールバックし、それ以外の場合はコミットすることをお勧めします。

b)接続オブジェクトの周囲には常にusingブロックを使用する必要があります(質問のコードを編集したばかりです)。そうすれば、接続を明示的に閉じて破棄する必要がありません。これは、すべての接続プロバイダタイプ(OracleConnectionを含む)が、基本クラス「DbConnection」を介してIDisposableインタフェースを実装しているためです。

于 2012-06-12T17:28:48.720 に答える