2

これは私が得ているエラーメッセージです

ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'OBPL_SU_PLAN_UPDATE_PLAN_DTLS'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

コード:

OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "CWPCDS.OBPL_SU_PROCESS_PKG.OBPL_SU_PLAN_UPDATE_PLAN_DTLS";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("P_PLAN_DETAIL_ID", OracleDbType.Int32).Value = detailId; 
cmd.Parameters.Add("P_PLAN_USER_DETAIL_ID", OracleDbType.Int32).Value = null; 
cmd.Parameters.Add("P_TRANSACTION_PLAN", OracleDbType.NVarchar2, 20).Value = null;
cmd.Parameters.Add("P_PLAN_REV_ID", OracleDbType.Int64).Value = planRev;                   
cmd.Parameters.Add("P_TRANSACTION_TYPE", OracleDbType.NVarchar2, 20).Value = transType;
cmd.Parameters.Add("P_PLAN_STATUS", OracleDbType.NVarchar2, 30).Value = status;  
cmd.Parameters.Add("P_DOC_ISSUE_DATE", OracleDbType.Date).Value = pid;
cmd.Parameters.Add("P_EST_OBLG_DATE", OracleDbType.Date).Value = eod;
cmd.Parameters.Add("P_AMT_TO_APPLY", OracleDbType.Int32).Value = amtApply;
cmd.Parameters.Add("P_WBS", OracleDbType.NVarchar2, 20).Value = wbs;
cmd.Parameters.Add("P_AMT1_TO_APPLY", OracleDbType.Int32).Value = 0;
cmd.Parameters.Add("P_AMT2_TO_APPLY", OracleDbType.Int32).Value = 0;
cmd.Parameters.Add("P_UPDATE_USER", OracleDbType.NVarchar2, 50).Value =
user;             
cmd.Parameters.Add("P_DESC_WORK", OracleDbType.NVarchar2, 50).Value = dow;
cmd.Parameters.Add("P_RET_CODE", OracleDbType.Int32).Direction =
ParameterDirection.Output;
cmd.Parameters.Add("P_RET_MSG", OracleDbType.Varchar2, 50).Direction =
ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();

エラーなしで Toad から手順を実行できます。Toad の日付形式は「05-MAY-2012」です。コード ビハインドの日付値に 1 つのクォートを追加しようとすると、「文字リテラルに文字が多すぎます」というエラーが表示されます。どんな支援や指示も大歓迎です!

4

2 に答える 2

3

DateTime .Net 値 (変数) を追加してから、パラメーターを変数に割り当てることをお勧めします。これにより、変換が処理されます。

DateTime dt = new DateTime(2012, 5, 7, 12, 23, 22, 0);
cmd.Parameters.Add(dt.ToString("dd-MMM-yyyy"), OracleDbType.Date).Value = dt;
于 2012-05-07T17:57:21.883 に答える
1

次を使用できます。

OracleCommandBuilder.DeriveParametersメソッド

各パラメータに必要なデータ型と名前を推測します。それがわかったら、それに応じてメソッドを変更できます。

使用することを決定したタイプがデータベースで期待されるタイプではないためにエラーが発生することがあります(つまり、C#DateTimeの場合、DBの種類に応じてTimeStamp、Date、SmallDateなどがあります。パラメーターに間違ったタイプを使用すると、エラーを引き起こすか、データを切り捨てます)。

値を文字列として渡そうとしないでください。それらを対応するC#タイプとして渡します。つまり、日付を渡すには、DateTimeオブジェクトを渡します。プログラムは、データベースが理解できる形式に変換するように注意します。文字列を渡す場合、それがユニバーサル形式でない限り、DB構成、つまりデフォルト言語を変更すると問題が発生する可能性があります。そのため、システムに変換の詳細を処理させる方がよいのです。それは常に正しい方法でそれを行います。

于 2012-05-07T17:52:59.317 に答える