- - PR -
データが Null です。
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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値が入っている項目を変換しようとしている等) 色々こちらでもデバッグしていますが、再現せず、また当のユーザーからも 具体的なフィードバックが無く困っております…。 宙をつかむ様な話かとは思いますが、どなたかご教示お願い申し上げます。 | ||||
|
投稿日時: 2003-11-17 16:54
追記事項です。
もし、エラー発生箇所の行番号を併せて表示出来る様な方法を ご存知の方がいらっしゃいましたら、併せてご指導お願い申し上げます。 | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2003-11-18 13:13
Jitta様、ご回答有難うございました。
エラー発生行の個所(行番号)についてなのですが、 開発用サーバーですと、正しくイベントビューアに記載されているのですが、 本番系サーバーでは、 ↓ イベント ID (0) (ソース http://hogewebsv/cont/xxxx/aaa.aspx 内) に関する説明が見つかりませんでした。リモート コンピュータからメッセージを表示するために必要なレジストリ情報またはメッセージ DLL ファイルがローカル コンピュータにない可能性があります。次の情報はイベントの一部です ↑ という内容が載ってきまして、vbline等の情報が欠落しております。 以前、.NETFrameworkを1.0をアンインストールして1.1をインストールしなおしたのですが、 何か設定等間違っているのでしょうか? 宜しくお願い申し上げます。 | ||||
|
投稿日時: 2003-11-18 13:29
本番系が1.0のときは取得できていたが、1.1にしてから取得できなくなった、ということでしょうか。
DLLをすべて1.1上でコンパイルし、コピーし直してみてください。「これは変更していないから」とコンパイルしていなかったり(依存関係の解決でコンパイルされているはずですが)、コピーしていなかったりすると読み込めません。 それから、エラーがでているのはDataReader.GetStringですね。失礼しました。これもNULL値を読むことはできないので、取得前にDbNull.Valueと比較して、if文で処理を分ける必要があります。 | ||||
|
投稿日時: 2003-11-18 19:49
Jitta様、ご回答有り難うございます。
ご指摘の通り、1.0では正常に取得出来ておりましたが、1.1にUpしてから 取得出来なくなりました。 本番系に移行する際は全て開発用サーバーでビルドしたものを移植している はずなのですが…(後、違いと言えば開発用は1.0と1.1が混在、本番系は1.1のみ)。 (やはり原因としてはこれが一番なのですよね?) それと本題であるデータがNullです…につきましては、 定期的にメインフレーム機からデータを転送しているPPが関係していました。 転送されてきたデータをテーブルに格納する際、一旦事前処理で Truncate Tableが発行されており、たまたまその処理と参照がぶつかってしまったのが 原因と思われます。 一応、応急処置として、Page_Errorイベントでエラーメッセージ内に “データが Null です”のフレーズがあれば注意を促す説明を表示する様に しました…。 本来ならばエラーコードが取得出来ればもっとスマートなのですが…。 | ||||
|
投稿日時: 2003-11-25 22:27
いつも参考にさせて頂いております。
18日にJitta様よりご指摘頂いた件ですが、 まことに申し訳ございません、当方の勘違いでした…。 1.0の時にも正常に取得出来ておりませんでした。 再度、1.1SDKをインストールしなおしてみたりしましたし、 DLLも全て再度コンパイルしなおしてみましたが、現象は変わらずです。 もし他にご指摘頂ける様でしたら、どなかた宜しくお願い申し上げます。 | ||||
|
投稿日時: 2003-11-26 09:15
DTさん、お早うございます。
えーと、質問の内容を整理したいのですが、例外の原因については一応、目星がついているんですよね? で、その例外に関する、行番号等の詳細情報を取得出来ないか? という事でよろしいでしょうか? 試していませんが、プロジェクトをデバッグモードでビルドしてデバッグ シンボル (.pdb 情報)も一緒に本番機に配置し、あと、configファイルで<compilation debug="true">を設定すれば例外の詳細を取得できると思います。 但し、これはあくまでも原因特定のための手段なので、問題が解決したら元に戻す必要があります。 あとは、トレースを有効にするとか...。 |