- PR -

ストアドプロシージャが動かない

投稿者投稿内容
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-02-17 21:20
お世話になっております。

質問させて下さい。
.net_frameworkとodp.netとoracle9iで開発を行っています。
ストアドプロシージャを使ってプログラムを組み実行したところ、
「OracleParameter object is already contained in a collection」
というメッセージが返されてエラーになってしまいました。

実はpt(プログラムテスト)の環境では正常に動作していたものがst(システムテスト)環境で上記エラーで動かなくなりました。

上記メッセージはなんとなくOracleParameterオブジェクトがダブっているという事なのかな、と推測はつくのですが、なぜ環境によって動いたり、動かなかったりするのかわかりません。もちろんpt、stとも.net_frameworkとodp.netとoracle9iで構成されている事は変わりないですし…。

何か心当たりのある方がいらっしゃったら、すばりでなくても「こういう可能性がありそう」程度のことでも良いので教えて頂きたいのですが。
漠然とした質問ですみませんが、よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-17 22:36
引用:

halさんの書き込み (2004-02-17 21:20) より:

ストアドプロシージャを使ってプログラムを組み実行したところ、
「OracleParameter object is already contained in a collection」
というメッセージが返されてエラーになってしまいました。


 「追加しようとしたオブジェクトが、コレクションにすでに追加されています」というエラーなのは押さえてあるのでしょうか?ST、PTのどちらが前工程かわかりませんが(ちなみにうちではSTの後にPT)、テストの範囲が拡大したということであれば、拡大したことによって同じルーチンを2度以上通るなど、前工程では検査されなかったプログラムパスを通っていることが考えられます。
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-02-18 15:41
お世話になっております。
Jittaさん、レスありがとうございます。

「追加しようとしたオブジェクトが、コレクションにすでに追加されています」というの追加しようとしたオブジェクト(今回の場合はOracleParameterCollection)が既に同名で定義済みということですよね?(そのまんまだ(汗))宣言は1度しかしてないのですが、う〜ん。
当方の開発環境はPT→STなのでおっしゃる通りテスト範囲の拡大によって何かしらの影響(2度ルーチンを通っている等)が出たのかもしれません…。
STではデバッグ出来ないのでまいっています(苦笑)。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-18 15:45
引用:

halさんの書き込み (2004-02-18 15:41) より:

「追加しようとしたオブジェクトが、コレクションにすでに追加されています」というのは追加しようとしたオブジェクト(今回の場合はOracleParameter)が既に同名で定義済みということですよね?(そのまんまだ(汗))宣言は1度しかしてないのですが、う〜ん。
(ちょっと修正)


 宣言、つまりプログラム中に1カ所しかなくても、OracleParameterCollectionが前のまま残っているような状況はありませんか?
 また、STの環境ではデバッグできないということですが、PTの環境で同じ操作をして確認することはできないのでしょうか?
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-02-19 11:55
お世話になっております。

引用:

Jittaさんの書き込み (2004-02-18 15:45) より:
 宣言、つまりプログラム中に1カ所しかなくても、OracleParameterCollectionが前のまま残っているような状況はありませんか?
 また、STの環境ではデバッグできないということですが、PTの環境で同じ操作をして確認することはできないのでしょうか?



当初は

OracleCommand myCommand = new OracleCommand();
OracleParameterCollection myParamCollection = myCommand.Parameters;
OracleParameter[] p1 = new OracleParameter[5];
p1[0]=myParamCollection.Add("pMidMoto" , OracleDbType.Char ,8 , ParameterDirection.Input);
p1[1]=myParamCollection.Add("pMidSaki" , OracleDbType.Char ,8 , ParameterDirection.Input);
p1[2]=myParamCollection.Add("pKid" , OracleDbType.Char ,8 , ParameterDirection.Input);
p1[3]=myParamCollection.Add("pUpduid" , OracleDbType.Char ,10 , ParameterDirection.Input);
p1[4]=myParamCollection.Add("pUpdymd" , OracleDbType.Char ,14 , ParameterDirection.Input);

p1[0].Value=strMid1;
p1[1].Value=strMid2;
p1[2].Value=strKid;
p1[3].Value=strUpduid;
p1[4].Value=strUpdymd;
………続くoracle接続

と実装していましたが
(これで「OracleParameter object is already contained in a collection」のエラーが出ました)、myParamCollectionの初期化も必要かなと考えて、

OracleCommand myCommand = new OracleCommand();
OracleParameterCollection myParamCollection = new OracleParameterCollection();
myParamCollection = myCommand.Parameters;
OracleParameter[] p1 = new OracleParameter[5];
………以降同上

としたところ、今度は
「Oracle.DataAccess.Client.OracleParameterCollection..ctor()」
というエラーが出ました(変わりました)。ますますわかりません…(冷汗)
すみませんが教えて下さい。

ST環境でdebug出来ないというのは、同じ操作は出来るのですが実際何処でエラーになっているのか調査出来ないという事です。当方の環境ではSTのdebugは画面への出力でしか出来ないのですが(PTでは再現できないし…)、上記データアクセス部分は画面からは切り離してカプセル化している為、response.write等での画面への自前トレース出力も出来ません(汗)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-19 15:55
引用:

halさんの書き込み (2004-02-19 11:55) より:

ST環境でdebug出来ないというのは、同じ操作は出来るのですが実際何処でエラーになっているのか調査出来ないという事です。当方の環境ではSTのdebugは画面への出力でしか出来ないのですが(PTでは再現できないし…)、上記データアクセス部分は画面からは切り離してカプセル化している為、response.write等での画面への自前トレース出力も出来ません(汗)


 イベントログに書き込むというてはあるのですが、、、
 エラーメッセージはどこかでトラップして作成しているのですよね?Application変数やSession変数にどこまで進んだか、書き留めてみてはいかがでしょう?本当にそこの処理でエラーになっているのか、怪しいと思います。
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-02-20 11:06
引用:

Jittaさんの書き込み (2004-02-19 15:55) より:
 イベントログに書き込むというてはあるのですが、、、
 エラーメッセージはどこかでトラップして作成しているのですよね?Application変数やSession変数にどこまで進んだか、書き留めてみてはいかがでしょう?本当にそこの処理でエラーになっているのか、怪しいと思います。



そうですね。
エラーを検出している範囲はわかるのですが、実際エラーになっている場所が分からなければ手の打ち様が無いですよね。Application変数に入れて、画面側のファイルで出力するというのは気付きませんでした。とりあえずなんとかエラーになっている処理を特定しようと思います。

漠然とした質問に対して丁寧にご回答頂き、ありがとうございました。
また解らない事がよろしくお願いします。
hal
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-02-24 15:27
お世話になっております。自己レスです。

カプセル化されたデータアクセスクラスから、constクラスで定義した項目に値を設定して画面上にトレースを出力する事が出来ました。その結果、やはりOracleParameterCollectionに追加する部分でエラーになっている事がわかりました。

環境によってなぜ動かなくなるのか分かりませんでしたが、とりあえず動かないと困るのでOracleParameterCollectionを使わずに

OracleParameter p1_1 = new OracleParameter();
p1_1.ParameterName = "pMidMoto";
p1_1.OracleDbType = OracleDbType.Char;
p1_1.Size = 8;
p1_1.Direction = ParameterDirection.Input;

このようにOracleParameterに一つ一つセットしたところ、うまくいきました。
色々とありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)