以下に書くコードを確認するまで、しばらくお待ちください。私には2つの方法があります:
public void AddInParameters(string parameterName, OracleDbType dbtype,
object value)
{
OracleParameter myparameter = new OracleParameter();
myparameter.ParameterName = parameterName;
myparameter.OracleDbType = dbtype;
myparameter.Value = value;
myparameter.Direction = ParameterDirection.Input;
this._parameters.Add(myparameter);
}
と
public void AddOutParameter(string parameterName, OracleDbType dbType)
{
OracleParameter myparameter = new OracleParameter();
myparameter.ParameterName = parameterName;
myparameter.OracleDbType = dbType;
myparameter.Direction = ParameterDirection.Output;
this._parameters.Add(myparameter);
}
プライベート フィールド _parameters は List 型です。ご覧のとおり、これらのメソッドはそれぞれ入力パラメーターと出力パラメーターを作成し、それらを _parameters リストに追加します。次に、OracleCommand を受け取り、リスト内のすべてのパラメーターをそれに追加する次のメソッドがあります。
private void ProcessParameters(OracleCommand command)
{
foreach (OracleParameter myparameter in this._parameters)
{
command.Parameters.Add(myparameter);
}
}
そして、OracleDataReader を返す最後のメソッドは次のとおりです。
public OracleDataReader ExecuteReader(string commandText, CommandType commandType)
{
OracleDataReader returnValue = null;
OracleCommand myCommand = this.CreateCommand(commandText, commandType);
this.ProcessParameters(myCommand);
try
{
myCommand.Connection.Open();
returnValue = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
throw new DatabaseException(ex.Message);
}
return returnValue;
}
これらのメソッドはすべて、データ アクセス層クラス ライブラリにあります。ExcuteReader メソッドを呼び出したいクラスでは、次のことを順番に実行します。
- 最初に AddInParameters と AddOutparameters を使用してパラメーターを追加します。
- 次に、ExecuteReader メソッドを呼び出します。
しかし、「間違った数またはタイプの引数」という Oracle 例外が発生することがあります。これらのメソッドの使用を拒否した場合、標準的な方法 (接続を作成し、次にコマンドを作成し、パラメータを 1 つずつ追加し、接続を開き、最後に OracleCommand.ExecuteReader メソッドを呼び出します) を使用して続行すると、そのエラーは発生しません。奇妙なことに、アプリケーションの入り口でこれらのメソッドを使用していますが、そこで例外が発生したことはありません。ExecuteReader メソッドを実行する前に、パラメーターのリストをチェックするブレークポイントを設定しました。すべて問題ないようです。つまり、すべてのパラメーターが正しく設定されています。ここで何が欠けているのか教えてください。
PS私は.NET用のOracleデータプロバイダー(Oracle.Data.Access.dll)を使用しています。