- PR -

データが Null です。

投稿者投稿内容
DT
常連さん
会議室デビュー日: 2003/05/06
投稿数: 31
投稿日時: 2003-11-17 16:44
まいどお世話になります。
ASP.NET(VB.NET) + SQL-Server2000で開発しておりますが、
時々下記内容のエラーが発生するとユーザーより報告があります。

(エラー内容)
データが Null です。このメソッド、またはプロパティは Null 値で呼び出せません。
at System.Data.SqlTypes.SqlString.get_Value()
at System.Data.SqlClient.SqlDataReader.GetString(Int32 i)
at Hoge.dl.Page_Load(Object sender, EventArgs e)
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain().

エラーが発生した際、Page_Errorイベントで、

Dim objErr As Exception = Server.GetLastError().GetBaseException()

Dim strWork1 As New StringBuilder()
strWork1.Append("<b>処理中のページでエラーが発生しました。</b><hr><br>")
strWork1.Append("<br><b>Date Time: </b>" & Now())
strWork1.Append("<br><br><b>Error in: </b>" & Request.Url.ToString())
strWork1.Append("<br><br><b>Error Message: </b>" & objErr.Message.ToString())

Dim err As String = strWork1.ToString()
Response.Write(err.ToString())

Dim strWork2 As New StringBuilder()
strWork2.Append(Page.Request.UserHostAddress.ToString())
strWork2.Append(Chr(9))
strWork2.Append(Chr(13))
strWork2.Append(objErr.Message.ToString())
strWork2.Append(Chr(9))
strWork2.Append(Chr(13))
strWork2.Append(objErr.StackTrace.ToString())

Dim logerr As String = strWork2.ToString()
EventLog.WriteEntry(Request.Url.ToString(), logerr, EventLogEntryType.Error)
Server.ClearError()

を記述してユーザーにエラー内容を表示させています。

お聞きしたいのが、前述のエラー内容で実際に箇所を特定するにあたり、
解析する方法等ございますでしょうか?
(例えば実際はNull値が入っている項目を変換しようとしている等)

色々こちらでもデバッグしていますが、再現せず、また当のユーザーからも
具体的なフィードバックが無く困っております…。

宙をつかむ様な話かとは思いますが、どなたかご教示お願い申し上げます。
DT
常連さん
会議室デビュー日: 2003/05/06
投稿数: 31
投稿日時: 2003-11-17 16:54
追記事項です。

もし、エラー発生箇所の行番号を併せて表示出来る様な方法を
ご存知の方がいらっしゃいましたら、併せてご指導お願い申し上げます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-18 09:10
 Exception.StackTraceででませんか?



 ヌルを許可していないエレメントにnullを代入しようとしている、またはデータベース中でnullのデータをIsNullチェックせずに読み出していると思います。データセットの構成を確認してください。

 自動生成か、スキーマデザイナを使ってXMLをデザインしていませんか?デフォルトでは、NULL(Nothing)はIsNullプロパティで判別しなければならず、プログラムから読んだり格納することはできません。.xsdの隠しファイルである.vbまたは.csファイルを見てください。

 この辺を制御するためには、スキーマデザイナで、NULLを入れたいエレメントの「nullvalue」プロパティと、「nillable」プロパティを変更します。ただし、これらの組み合わせや、エレメントタイプによってはコードジェネレータが異常終了します。例えば、エレメントタイプがdateの場合、nillable=trueやnullvalue=nullは異常終了します。異常終了するとコードが生成されず、大量のコンパイルエラーが発生します(つまり、経験者)。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-11-18 09:13 ]
DT
常連さん
会議室デビュー日: 2003/05/06
投稿数: 31
投稿日時: 2003-11-18 13:13
Jitta様、ご回答有難うございました。

エラー発生行の個所(行番号)についてなのですが、
開発用サーバーですと、正しくイベントビューアに記載されているのですが、
本番系サーバーでは、

イベント ID (0) (ソース http://hogewebsv/cont/xxxx/aaa.aspx 内) に関する説明が見つかりませんでした。リモート コンピュータからメッセージを表示するために必要なレジストリ情報またはメッセージ DLL ファイルがローカル コンピュータにない可能性があります。次の情報はイベントの一部です

という内容が載ってきまして、vbline等の情報が欠落しております。
以前、.NETFrameworkを1.0をアンインストールして1.1をインストールしなおしたのですが、
何か設定等間違っているのでしょうか?

宜しくお願い申し上げます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-18 13:29
 本番系が1.0のときは取得できていたが、1.1にしてから取得できなくなった、ということでしょうか。

 DLLをすべて1.1上でコンパイルし、コピーし直してみてください。「これは変更していないから」とコンパイルしていなかったり(依存関係の解決でコンパイルされているはずですが)、コピーしていなかったりすると読み込めません。


 それから、エラーがでているのはDataReader.GetStringですね。失礼しました。これもNULL値を読むことはできないので、取得前にDbNull.Valueと比較して、if文で処理を分ける必要があります。
DT
常連さん
会議室デビュー日: 2003/05/06
投稿数: 31
投稿日時: 2003-11-18 19:49
Jitta様、ご回答有り難うございます。

ご指摘の通り、1.0では正常に取得出来ておりましたが、1.1にUpしてから
取得出来なくなりました。
本番系に移行する際は全て開発用サーバーでビルドしたものを移植している
はずなのですが…(後、違いと言えば開発用は1.0と1.1が混在、本番系は1.1のみ)。
(やはり原因としてはこれが一番なのですよね?)

それと本題であるデータがNullです…につきましては、
定期的にメインフレーム機からデータを転送しているPPが関係していました。
転送されてきたデータをテーブルに格納する際、一旦事前処理で
Truncate Tableが発行されており、たまたまその処理と参照がぶつかってしまったのが
原因と思われます。
一応、応急処置として、Page_Errorイベントでエラーメッセージ内に
“データが Null です”のフレーズがあれば注意を促す説明を表示する様に
しました…。
本来ならばエラーコードが取得出来ればもっとスマートなのですが…。
DT
常連さん
会議室デビュー日: 2003/05/06
投稿数: 31
投稿日時: 2003-11-25 22:27
いつも参考にさせて頂いております。

18日にJitta様よりご指摘頂いた件ですが、
まことに申し訳ございません、当方の勘違いでした…。
1.0の時にも正常に取得出来ておりませんでした。
再度、1.1SDKをインストールしなおしてみたりしましたし、
DLLも全て再度コンパイルしなおしてみましたが、現象は変わらずです。

もし他にご指摘頂ける様でしたら、どなかた宜しくお願い申し上げます。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-11-26 09:15
DTさん、お早うございます。

引用:

DLLも全て再度コンパイルしなおしてみましたが、現象は変わらずです。

もし他にご指摘頂ける様でしたら、どなかた宜しくお願い申し上げます。


えーと、質問の内容を整理したいのですが、例外の原因については一応、目星がついているんですよね?
で、その例外に関する、行番号等の詳細情報を取得出来ないか? という事でよろしいでしょうか?
試していませんが、プロジェクトをデバッグモードでビルドしてデバッグ シンボル (.pdb 情報)も一緒に本番機に配置し、あと、configファイルで<compilation debug="true">を設定すれば例外の詳細を取得できると思います。
但し、これはあくまでも原因特定のための手段なので、問題が解決したら元に戻す必要があります。
あとは、トレースを有効にするとか...。

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