日経BP社 ブックス&テキスト Online

「マイクロソフト関連書」「Autodesk公式トレーニングガイド」「MOS攻略問題集」「セミナーテキスト」「スクール標準教科書」などの各シリーズ、各種IT関連書籍をご案内するサイトです。

書籍訂正情報

『.NETエンタープライズWebアプリケーション開発技術大全Vol.2 ASP.NET基礎編』をお買い上げの方へ

本書の内容に誤りがございました。以下の通り、お詫びして訂正いたします。

■137ページの本文1行目
「パラメタライズドクエリを使えばSQL挿入の脆弱性を回避できる」の部分に対して、以下の注記を脚注として追加します。

なお、パラメタライズドクエリを利用する場合でも、LIKE 句に対してパラメタライズドクエリを利用する場合には、後述するような文字列のエスケープ処理が必要になる。

■p.232〜p.233 セッションデータからデータを復元する際の方法について

解説に一部誤りがありました。

(誤)
DataGrid1.DataSourceプロパティは、Page_Load()メソッドに到達するまでの間やInitializeComponent()メソッドの中で初期化・設定されるわけではありません。

(正)
DataGrid1.DataSourceプロパティは、DataBind()メソッドを発行した時点で評価されます。このため、Session変数から取り出したAuthorsDataSetインスタンスを変数authorsDataSet1に直接代入しても、p.232〜p.233に解説されているような問題は(p.232〜p.233で解説されているようなケースでは)発生しません。

図7-68に対応する正しい図と、処理の流れは以下の通りです。

@ まず、InitializeComponent()処理の中で、authorsDataSet1変数に、空のインスタンスαへの参照が張られます。
A 次に、Page_Load()メソッド内でSessionデータから復元したインスタンスβを変数authorsDataSet1に代入すると、参照がAのように張り替えられます。
B この後、イベントハンドラなどでDataBind()を行うと、DataBind()命令を発行したタイミングでDataGrid1.DataSourceプロパティに割り当てている変数名(authorsDataSet1)が評価されます。

この結果、DataGrid1.DataSourceプロパティには正しくインスタンスβへの参照が入り、結果として正しくデータが表示されます。

(ご注意)
上記のような解説の誤りはありましたが、セッションデータからデータを復元する際には、やはりMerge()メソッドによる復元を推奨します。

これは、p.232〜p.233で解説しているような「正しくデータが表示されない」現象は、この後のページで解説しているような、DataViewを挟み込んでいる時に発生するためです。これについて、以下に捕捉説明します。

DataViewを間に挟んでデータバインドを行う場合には、以下の図のように参照が張られます。
@ まず、InitializeComponent()処理の中で、authorsDataSet1変数に、空のインスタンスαへの参照が張られます。
A また、同じくInitializeComponent()処理の中で、dataView1変数のTableプロパティにauthorsDataSet1変数(すなわちインスタンスαへの参照)が代入されます。これにより、Aで示したような参照が張られます。
B 次に、Page_Load()メソッド内でSessionデータから復元したインスタンスβを変数authorsDataSet1に代入すると、参照がBのように張り替えられます。
しかし、dataView1変数のαへのポインタは変更されません。
C この後、イベントハンドラなどでDataBind()を行うと、DataBind()命令を発行したタイミングでDataGrid1.DataSourceプロパティに割り当てている変数名(dataView1)が評価されます。

しかし、dataView1が参照しているインスタンスはαであるため、画面には空のデータが表示される(=何も表示されない)という現象が発生します。

実際の業務アプリケーションでは間にDataViewを挟んでいるケースも多々あります。しかし各開発者の方々に、DataViewを利用している場合とそうでない場合で異なるコーディングを求めるのはミスを誘発しやすいと言えます。このため、筆者は簡単のために常にMerge()メソッドで復元することを推奨しています。

訂正INDEXページへ戻る>>