- PR -

オブジェクト参照エラーについて

投稿者投稿内容
taro
ベテラン
会議室デビュー日: 2003/08/06
投稿数: 55
投稿日時: 2003-08-26 13:38

ASP.NETでWebアプリを開発しているのですが、

同じプログラム、同じ環境で、
「オブジェクト参照がオブジェクト インスタンスに設定されていません」というエラーが出るときと出ないときがあります。

皆様はこのようなご経験はありますか?

もしこのようなエラーが出た場合の対処方法などがありましたらご教授ください。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2003-08-26 14:08
引用:

taroさんの書き込み (2003-08-26 13:38) より:
ASP.NETでWebアプリを開発しているのですが、

同じプログラム、同じ環境で、
「オブジェクト参照がオブジェクト インスタンスに設定されていません」というエラーが出るときと出ないときがあります。



同じプログラム、同じ環境とありますが、他の条件もすべて同じですか?
遷移元ページは同じですか?遷移元ページで入力したデータは同じですか?
そのページで(DBなどから)参照しているデータの内容は同じですか?
それらがまったく同じでないなら、普通に起こりうることです。

NullReferenceExceptionが起きているだけなので、
こういう場合はほぼ間違いなく自分のプログラムの不具合です。

使用している変数で初期化していないものはないですか?
遷移元ページからSessionなどで引き渡されている情報はnull(Nothig)ではないですか?

引用:

もしこのようなエラーが出た場合の対処方法などがありましたらご教授ください。



どこで発生しているか?を突き止めて、どのデータがnullになっているか確認し、
それに応じて原因となっている個所を修正します。

後、「ここではxxxというデータが渡されてくるはず」といったような仮定はせずに、
本当にその通りになっているかどうかエラーチェックをするようにした方がよいでしょう。
taro
ベテラン
会議室デビュー日: 2003/08/06
投稿数: 55
投稿日時: 2003-08-26 15:52
よねKEN さま

ご指摘ありがとうございます。

質問をしておきながらあいまいな問いかけで申しわけありませんでした。

もう一度質問を書き直しますと

遷移元も遷移先も同じ、入力した条件も同じ、DBからデータを取得するSQL文も同じ時に
データを取得して配列で返す場合とデータを取得できずにNothingで返す場合があります。
その結果、そのあとのデータの表示部でオブジェクト参照エラーが発生してしまいます。

コードは下記のような感じで書いてあります。


 [例]

dim strData() as string  'データ格納配列
 dim strSql as string 'SQL文

clsdb.DBConnect() 'データベースに接続
clsdb.DBQuery(strSql) 'SQL実行
strData = clsdb.GetData() 'データの取得

 if strData(0) = "0000" then ←オブジェクト参照エラー発生場所
.
.
.





Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-26 16:38
 こういう場合、とりあえずブレークポイントを張って、SQL文が意図したとおりに構成されているか調べます。

 こっちのページでは発生せず、あっちのページでは必ず発生するというのであれば、Webアプリケーションの特性(ユーザからのアクションを受けるときは、毎回新しいオブジェクトが作成されている)を理解していないためと思われます。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2003-08-26 16:53
引用:

taroさんの書き込み (2003-08-26 15:52) より:
 [例]

dim strData() as string  'データ格納配列
 dim strSql as string 'SQL文

clsdb.DBConnect() 'データベースに接続
clsdb.DBQuery(strSql) 'SQL実行
strData = clsdb.GetData() 'データの取得

 if strData(0) = "0000" then ←オブジェクト参照エラー発生場所



そこで例外があがっているのであれば、
> clsdb.GetData() 'データの取得

が期待するデータを返していないと思われます。

clsdbという変数の型は何でしょう。
使用しているメソッドの名前からすると独自のクラスと思いますが、
DBConnectメソッドは正常に処理されていますか?

例えば、内部でExceptionをCatchしつつ、エラーがあがっていても無視していれば、
コネクションを貼るのに失敗したまま処理を続行しているというようなこともありえます。
また、接続が成功したかどうかを戻り値で戻しているようなタイプのメソッドであれば、
その値をチェックする必要もありますが、
提示の情報からでは私にはその辺りに問題がないのかどうか判断できませんので
ご自身でご確認ください。
次の、DBQueryメソッドも同様に正常に処理されているかご確認ください。

後は、念のため、strSqlの中身を使用しているDBMSのツールなどから流して、
正常に結果を取得できるかどうか確認しましょう。

そこまでOKであれば、GetDataメソッドの中身も順に確認しましょう。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-26 16:59
引用:

データを取得して配列で返す場合とデータを取得できずにNothingで返す場合があります。
その結果、そのあとのデータの表示部でオブジェクト参照エラーが発生してしまいます。

dim strData() as string  'データ格納配列
.
.
.
strData = clsdb.GetData() 'データの取得

 if strData(0) = "0000" then ←オブジェクト参照エラー発生場所
.
.
.


Nothingで返されるんだったらそれはもうエラーになりそうな気がしますが…
taro
ベテラン
会議室デビュー日: 2003/08/06
投稿数: 55
投稿日時: 2003-08-26 19:04

皆様 ご指摘ありがとうございました。

皆様のご指摘のように一つ一つブレイクポイントを立てチェックした結果、
Olacleに接続できている場合とできていない場合で私が質問したエラーが起こることが分かりました。

現状では、なぜOlacleに接続できる場合とできない場合があるのかを調査中です。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-27 08:34
引用:

taroさんの書き込み (2003-08-26 19:04) より:

現状では、なぜOlacleに接続できる場合とできない場合があるのかを調査中です。


 Exceptionが発生していると思いますが、Exception.Messageはご覧になりましたか?また、Exceptionの型も重要な情報です。すべてをわかってExceptionをキャッチしているならよいのですが、そうでないなら、まずはExceptionを受けずにメッセージを表示させ、一通りのテスト終了後に受けるように修正する、とした方がよいでしょう。
 せっかく提供されている情報があるのにそれを利用しないなら、時間と労力を無駄にするだけですよ。

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