ADO.Net(ODP.NET)コマンド実行時にパラメータオブジェクトを共用できない
1568 ワード
今日、分散型データベースへのアクセスをテストするときに、例外が発生しました.OracleParameterはすでにオブジェクトセットにあります.最初は重複追加の問題だと思っていましたが、複数のテストを経ても問題があるのか、その後、入力パラメータをクローンしてコマンドパラメータに割り当て、問題を解決しました.後で不思議に思って、ネットで調べてみると、これらのパラメータオブジェクトが複数のコマンドに同時に追加できないようで、具体的なメカニズムは分からない.しかし、1つのパラメータオブジェクトが複数のコマンドに追加するも、実際には同じものを指しているのか、オブジェクトが同じであるのか、ADOが最下位でコマンドパラメータを修正する(戻り値パラメータは必ず修正する)場合、1つのパラメータオブジェクトが複数のコマンドに追加することは容易に理解できない.それは混乱をもたらすからだ.
上のtry、catchは実際に取り除くべきで、私はこれを書くのは虫を捕まえるためです!実は私が何気なく解決の道を発見したのは、私のマルチスレッドのためで、私の考えはできるだけ変数を独立して開いて、共有しないので、何気なく正しい道を歩いたからです.
PS:学習は間違いの中で進歩して、間違いがあってこそ未来がある!
思い出しましたが、実はこのルールはSilverlightがエンティティデータをサーバから取得した後も、他の集合に参加することはできません.
private void PrepareCommand(OracleCommand Command, OracleParameter[] Parameters, OracleTransaction Trans)
{
try
{
Command.Parameters.Clear();
if (Parameters != null)
{
foreach (var p in Parameters)
{
//
OracleParameter theP = ((ICloneable)p).Clone() as OracleParameter;
Command.Parameters.Add(theP);
//Command.Parameters.Add(p); // .
}
}
if (Trans != null)
{
Command.Transaction = Trans;
}
}
catch
{
}
}
上のtry、catchは実際に取り除くべきで、私はこれを書くのは虫を捕まえるためです!実は私が何気なく解決の道を発見したのは、私のマルチスレッドのためで、私の考えはできるだけ変数を独立して開いて、共有しないので、何気なく正しい道を歩いたからです.
PS:学習は間違いの中で進歩して、間違いがあってこそ未来がある!
思い出しましたが、実はこのルールはSilverlightがエンティティデータをサーバから取得した後も、他の集合に参加することはできません.