6

私はOracleからC#でこのprocを呼び出しています。エラーを返すようにプロシージャを作成しました。つまり、proc が失敗し、pv_error に文字列が入力され、ロールバックがトリガーされますが、機能しません。理由はわかりません。それで、私は何を間違っていますか?前もって感謝します。

private void hhrcv_update_dc_grs_carton()
    {
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = conn;
        conn.Open();
        OracleTransaction trans = conn.BeginTransaction();
        cmd.CommandTimeout = 0;
        cmd.CommandText = "dc.hhrcv_update_dc_grs_carton";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("pn_dc_grs_no", OracleDbType.Number).Value = txtDcGRSNo.Text;
        cmd.Parameters.Add("pn_pallet_id_no", OracleDbType.Number).Value = txtPalletId.Text;
        cmd.Parameters.Add("pn_carton_code", OracleDbType.VarChar).Value = txtCartonCode.Text;
        cmd.Parameters.Add("pn_company_id_no", OracleDbType.Number).Value = Companyid;
        cmd.Parameters.Add("pn_order_no", OracleDbType.Number).Value = txtOrderno.Text;
        cmd.Parameters.Add("pn_emp_id_no", OracleDbType.Number).Value = empid;
        cmd.Parameters.Add(new OracleParameter("pv_error", OracleDbType.VarChar));
        cmd.Parameters["pv_error"].Direction = ParameterDirection.Output;
        string pv_error;
        cmd.ExecuteNonQuery();
        pv_error = cmd.Parameters["pv_error"].Value.ToString();

        if (pv_error.ToString() == "")
        {
            trans.Commit();
        }
        else
        {
            trans.Rollback();
            MessageBox.Show("" + pv_error, "Error");
            frmReturns r = new frmReturns();
            r.Show();
            this.Hide();
        }
    }
  1. ストアド プロシージャがコミットされていません
  2. Oracle SQL 開発者の自動コミットが無効になっています
  3. Oracle SQL開発者でストアドプロシージャを実行すると、動作します(失敗します-作成したようにコミットしません)
  4. VS2005 でストアド プロシージャを実行している場合にのみ、proc が失敗し、ロールバックがトリガーされますが、実行されません。
4

2 に答える 2

9

ほとんどの場合、次を追加する必要があります。

cmd.Transaction = tran;

電話した後BeginTransaction

cmdこれがないと、ランタイムはそれがトランザクションの一部であることを知りませんtran!

詳細については、ドキュメントを参照してください。

于 2013-02-12T14:20:14.750 に答える
2

コメントに投稿したように、接続の Autocommit プロパティを確認することを強くお勧めします。

Oracleのドキュメントに記載されているように

このプロパティは、各 SQL ステートメントの実行後に現在のトランザクションに対して Commit が呼び出されるかどうかを決定します。それ以外の場合は false。デフォルト値は true です。

だから少なくとも試してみてください

conn.Autocommit=false;
于 2013-02-12T14:11:46.713 に答える