- PR -

エラーの対処方法

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-11 15:05
引用:

ふらわーさんの書き込み (2008-01-11 14:04) より:

確認してみたところ確かにConnectionがNothingでした。
でもなぜここでNothingになるのかがわかりません。。。


やはりそうでしたか。 ただ Connection というのは使い終わったら即破棄するのが基本です。 逆をいえば使う直前に生成してコネクションを確立しておくべきです。

DB.DBAccess.DBConnection がクラス ライブラリから取得しているものであれば、クラス ライブラリ側にコネクションを確立するメソッドが提供されていませんか? もし DBConnection に対してインスタンスを生成できないようであれば、とんでもないライブラリです。(シングルトンで扱わせようとしているかわかりませんが、なんであれひどいです)

引用:

ページロードと検索ボタンクリックの時に
「Dim Cmd As New OracleCommand(strSQL, DB.DBAccess.DBConnection)」
という同じ処理を行っているというのが悪い原因なのでしょうか??


目の付け所としてはその前後が良いと思います。

引用:

ページロードの処理内容を確認したところ、こちらではConnectionには値が入っていました。しかし検索ボタンクリック処理のところではConnectionがNothingとなっていました。


となっているので、"ページロード" と仰っている処理の後から、検索ボタンを押下するまでの間に破棄になっているのでしょう。(破棄するのは良いことです)

また "ページロード" と仰っている処理の時にはインスタンスがあるわけですから、それ以前に Connection のインスタンスを生成している処理があるということになります。

デバッガを駆使してもう少し追ってみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-11 15:24
引用:

ふらわーさんの書き込み (2008-01-11 14:09) より:

確かにこのプログラム意味不明な箇所がたくさんあります。誰かが書いたものなのですが、それを参考に書くようにと言われているので直したくても直せません。。。直してあとで色々言われたらいやなので。


ルールで決められているとすれば (どうしようもないルールでも) 守らなければならないです。 空気を読みつつ提案するのも良しかもしれませんが、無難なのは動いている間はそのままにしておくことです。

引用:

初心者なので偉そうなことは言えませんが、私はStringBuilderしか使ったことがないです。やっぱりStringBuilderが正当な方法なんですかね??


好む人も多いようですが、実は私はあまり好きではないです。 理由は見づらいのとリリース後の改変が面倒くさいからです。 SQL クエリは長くなるのを回避するために Stored、Function を駆使することが多いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-18 12:15
じゃんぬねっと様

返信していただいていたのですね。
ちょっとバタバタしていて見れていませんでした。申し訳ありません。


引用:
--------------------------------------------------------------------------------


DB.DBAccess.DBConnection がクラス ライブラリから取得しているものであれば、クラス ライブラリ側にコネクションを確立するメソッドが提供されていませんか? もし DBConnection に対してインスタンスを生成できないようであれば、とんでもないライブラリです。(シングルトンで扱わせようとしているかわかりませんが、なんであれひどいです)


--------------------------------------------------------------------------------


はい、まさにその通りです。
ということはやっぱりクラスライブラリ側に問題ありってことですか…

シングルトンで使わせようとしているのでしょうかねぇ〜
たぶん今まで別のプロジェクトで使用していて問題なかったから、流用して様々な事態に対応できるようには作成していないのでしょう。

いまだにこの問題解決していないので、大変困っているのですがこのクラスライブラリを使用しつつエラー回避するのは難しいってところですかね??

時間があればもうちょっと追及してエラーを修正してこのクラスライブラリを使用したいと思っているのですが、あまり時間がないので迷っています。

この問題にぶち当たってから1週間以上経っているので…

となるとクラスライブラリを使用せずに、元のフォームでDBConnection生成したりする処理を無理やり書いてやるか、新たなクラスライブラリを作成するか…

もうちょっとソースは追ってみる予定ではいます。


それと色々とアドバイスありがとうございます。

ソースコードについては、時間がある時にこっそりちょっとずつ改変しています。
いろんなやり方があってどれがいい方法なのかがわかるまでには、まだまだ時間がかかりそうです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-18 16:16
引用:

ふらわーさんの書き込み (2008-01-18 12:15) より:

はい、まさにその通りです。
ということはやっぱりクラスライブラリ側に問題ありってことですか…


こちらで参照を解放しているコードがないのであればそうなります。

引用:

シングルトンで使わせようとしているのでしょうかねぇ〜
たぶん今まで別のプロジェクトで使用していて問題なかったから、流用して様々な事態に対応できるようには作成していないのでしょう。


もしそうであれば提案してあげてください。 場合によっては後戻りが多く発生するかもしれません。

引用:

いまだにこの問題解決していないので、大変困っているのですがこのクラスライブラリを使用しつつエラー回避するのは難しいってところですかね??


そうですね。 クラス ライブラリ側に原因があるなら、こちらで回避するということは不可能です。

引用:

となるとクラスライブラリを使用せずに、元のフォームでDBConnection生成したりする処理を無理やり書いてやるか、新たなクラスライブラリを作成するか…


使用するたびに Connection を生成した方が安全です。 ローカル変数であることも強みになります。 どうしてもクラス ライブラリから参照しなくてはならないのであれば、クラス ライブラリ作成者に問題点を指摘するしかないですね。 せめてただのラッパ クラスなら見逃してあげたいのですがね...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-18 18:22
じゃんぬねっと様

なんかいろいろ試してはみたものの、やっぱりクラスライブラリを修正するのが後々のことを考えると早いのかなという気がしました。
ちょっとまだどうするかは検討中なのですが…


引用:
--------------------------------------------------------------------------------


使用するたびに Connection を生成した方が安全です。 ローカル変数であることも強みになります。 どうしてもクラス ライブラリから参照しなくてはならないのであれば、クラス ライブラリ作成者に問題点を指摘するしかないですね。 せめてただのラッパ クラスなら見逃してあげたいのですがね...

--------------------------------------------------------------------------------


もともとサンプルソースをもらってコーディングを始めたのですが、その時になんか気持ち悪いなと思っていたのです。


Dim strSQL As String = GetSQL(SQL.検索) 'SQL取得
Dim Cmd As New OracleCommand(strSQL, DB.DBAccess.DBConnection) 'SQL文セット
dr = DB.DBAccess.SelectReader(Cmd) 'SQL文の実行 


たった3行だけでDBから結果をもらっていたのが、どうもしっくりきませんでした。
やっぱりおかしかったのですね。。。
経験不足で全然気づきませんでしたが、DB接続の前にはオープン、接続後にはクローズをクラスライブラリ側ではなく、呼び出し元でするのが普通ですよね。
他のソース見てみてもそうなっていました。
クラスライブラリ側でやっていると、いつオープンしてクローズしてるかなど動きが全く見えなくてどこでエラーが出ているか特定するのが難しいです。。。

しかしほかのソリューションで同じようなことをやってみると、こんなエラーにならなかったものもあったようです。
私が見た限りでは8割から9割がたエラーになってましたが。。。

私の見解ではその場合、たまたま例外が起きなかっただけではないかと思っています。

だけどそんなことってありえるのでしょうか??

エラーにならなかったコードを参考にもう一度始めから作成してみましたが、やっぱりエラーになってしまいました…
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-01-18 18:41
引用:

じゃんぬねっとさんの書き込み (2008-01-11 15:05) より:
DB.DBAccess.DBConnection がクラス ライブラリから取得しているものであれば、クラス ライブラリ側にコネクションを確立するメソッドが提供されていませんか? もし DBConnection に対してインスタンスを生成できないようであれば、とんでもないライブラリです。(シングルトンで扱わせようとしているかわかりませんが、なんであれひどいです)


なんかこの方向で話しが進んでるような気がしますが、ライブラリの設計、使い方、仕様、トランザクションの制御方法等、この辺りの情報が一切ない状態では一概にライブラリが悪いなんていえません。
※もちろん悪い可能性はありますが

まず正しい使い方、想定を確認することです>元質問者様
それでやっぱりライブラリの仕様上対応できないとか、問題があるならそちらの改修なんかが必要という話しになるでしょうけど。

単に使い方が間違っているという可能性もあるでしょうから。
※私には、それを元質問者さんが「きちんと」確認したようには見えないのです、流れ的に

--引用ミス修正

--追記
何か誤解を招きそうなので…
じゃんぬねっとさんが書かれていること自体は間違ってはいないとは思うのですが、どうも本当にそれが確認できている感じがしないというか、なんとなく短絡な判断につながってしまっているような気がしないでもないというか、そんな感じです。


[ メッセージ編集済み 編集者: なちゃ 編集日時 2008-01-18 18:47 ]
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-18 18:53
なちゃ様

確かにこの会話だけ見ていたら、ちゃんと確認もせずに適当なことを言っていると思われるかもしれません。

もともとライブラリを作成した人(別会社の人だから誰かは知りませんが)からサンプルコードや使用方法の説明書をもらっています。
ライブラリの使用方法についてはそれに基づいてするようにということで、それに従っているので間違っていないはずなのです。
サンプルコードでも使用できていました。

エラーが初めて出たのは、サブ画面表示用のボタンを複数並べたところからでした。
サンプルコードではサブ画面表示はひとつしかなかったのですが、ほかのソリューションでは複数のサブ画面を呼び出す必要があるので、呼び出し側のフォームに複数のボタンを並べています。
たしかにサブ画面表示をひとつにすればエラーは出ません。

となるとDBの接続関係の方が怪しいのかなと思いました。
ごみが残ってしまっているとか??

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-18 19:08
引用:

なちゃさんの書き込み (2008-01-18 18:41) より:

--追記
何か誤解を招きそうなので…
じゃんぬねっとさんが書かれていること自体は間違ってはいないとは思うのですが、どうも本当にそれが確認できている感じがしないというか、なんとなく短絡な判断につながってしまっているような気がしないでもないというか、そんな感じです。


お気づかいありがとうございます。 一応確認すべきだと思いましたので "メソッドは提供されていないか?" とは書いたものの他に調べておくべきことを書いていなかったので、私の説明不足は否めないと思います。 ですのでフォローして頂けると非常にありがたいです。

引用:

ふらわーさんの書き込み (2008-01-18 18:53) より:

となるとDBの接続関係の方が怪しいのかなと思いました。
ごみが残ってしまっているとか??


3 つほど前の投稿にも書いたのですが、ちょっと書き方が悪かったのでもう 1 度書かせてください。

そのライブラリ上の Connection のインスタンスがいつ生成されるか、そしていつ参照が解放されてしまっているのかを調査するのが先だと思います。 あとは、DBConnection が読み取り専用かどうかも調査して頂けませんか?

コードから追った方が早いかもしれませんが、掲示板でのやり取りなので...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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