「コンパイル時に実行できることを実行時まで延期しないでください。」
David Gries 氏、デジタル コンピューター用コンパイラー構築
はじめ
に プログラマーとして、新しいテクノロジーを学ぶとき、サンプルが最大の敵になることがあります。多くの場合、ガイドラインはシンプルで理解しやすいように設計されていますが、同時に、怠惰で非効率的、さらには危険なコード作成の増加につながる可能性があります。このような最も一般的な状況は、ADO.NET パラダイムで発生します。この記事では、例が不足しているにもかかわらず、データベース内に強く型指定されたオブジェクトがあり、プログラム内でそれを可能にすることが何を意味するのかを見ていきます。
もう少し具体的に、Visual Studio 2005 で厳密に型指定されたデータセットがどのように作成され、使用されるかを見ていきます。この記事で説明するように、強く型指定されたデータ セットには、別の弱く型指定されたデータ アクセス手法に比べて多くの利点があります。ここでは、Visual Studio 2005 では、厳密に型指定されたデータセットの作成と使用がそれほど簡単ではないこともわかります。さらに詳しく知りたい場合は、読み続けてください。
強く型付けされたオブジェクトの基本と利点
強い型付けの意味を理解するには、まずデートについて考えることができます。あなたが独身だったら、どのようなタイプの人とデートを考えますか?特定の基準 (健康で魅力的であるなど) がある場合もあれば、その基準が単純または不明瞭である場合もあります。あなたの状態が何であっても、誰とより多くの時間を過ごすかを決めるとき、あなたは常にこれらのタイプについての独自の一定の基準を使用して比較検討します。賢い人であれば、感情的なトラウマから身を守るためにたくさん考えるでしょう。たとえば、アルコール依存症の人と一緒にいると、二人が真剣な関係にない限り不安定になるかもしれません。しかし、人を変えることは苦痛であり、非常に困難です。したがって、あなたの知恵は、関係が始まる前に関係を止めるように指示するでしょう。デートの基準に飲酒禁止条項を追加すると、将来の心痛からあなたを守り、より良い候補者に時間とエネルギーを集中させることができます。
この推論がプログラミングとどのような関係があるのか驚かれるかもしれません。関係ないよ、素敵な読者さん、一緒に来てね! ADO.NET データ アクセス オブジェクトは、非常に柔軟になるように設計されています。データベースからデータを読み取るときは、特別な問題が発生しない限り、通常の .NET フレームワークで許可されている一般的な種類のオブジェクトの多くを操作することになるでしょう。私たちの年代測定理論を適用すると、基本的に関連データを普遍的なオブジェクトとして考えることができます。 「デートに支障がなければ、もっとはっきり言ってもらえませんか?」人間でも他の生き物でも無制限!あなたの友人として、私はあなたに「もっと標準を!もっとリストを小さくして!」とお願いします。
デートする相手を無視すると、将来的に人間関係に問題が生じる可能性があるのと同様に、コード内でオブジェクトをチェックしないままにしておくと、エラーが発生する可能性があります。また、サブルーチン内で古いオブジェクトを放っておくと、プログラムが実行されるまでこれが問題であることに気づかない可能性があります。私たちのデート理論を使用すると、実行時にエラーを検出することは、トレンディーなイタリアン レストランの真ん中で、デート相手に苦痛で気まずい口論をさせるようなものです。そう、事前に計画を立てていたら、大勢の客に見られることにはならなかったし、恥ずかしい思いをすることもなかったはずだ。より厳格な標準をコードに適用するだけで、プログラムのコンパイルを開始する前にエラーを検出できます。たとえば、次のコード例:
string FirstName = myrow.("FirstName").ToString();
この例の DataRow は型指定されていないため、必要な値を取得するには列名を文字列として使用する必要があります (または、レコードの列コレクション内の列のインデックスを使用することを選択できます)。幸いなことに、そのコラムは存在します。 DataRow 列のデータ型はオブジェクトであると想定しており、FirstName 列のデータ型は文字列であると想定しており、使用する前に明示的に文字列に変換する必要があります。この列の名前が変更された場合 (たとえば、PersonFirstName になった場合)、コンパイラーはそれを通知する方法がありません。押し下げられた?しかし、その必要はありません。コードが次のようであれば、作業はよりシンプルになり、コードの信頼性も高まります。
た
行を使用しており、FirstName プロパティの型が string であることがわかっています。面倒な列名や面倒な型変換は必要ありません。コンパイラはすでに型チェックを行っているため、列名が正しく入力されているかどうかを気にすることなく、他の作業を安全に実行できます。
他はすべて同じなので、ジェネリック タイプの代わりにこれを使用することを躊躇する必要はありません。しかし、ちょっと待ってください。厳密に型指定されたオブジェクトはどこから来たのでしょうか?これらのオブジェクトは自動的に作成されることもお伝えしておきたいと思います。ただし、良好な関係に時間と労力がかかるのと同様に、オブジェクトを厳密に型指定するには追加の労力がかかります。しかし、ここで余分に費やす時間は間違いなく価値があり、将来的に「バグの捕捉」に費やす時間を大幅に節約できます。
厳密な型指定を実現するにはいくつかの方法があります。この記事の残りの部分では、Visual Studio 2005 で厳密に型指定されたデータセットを作成する方法を説明します。また、このアプローチの長所と短所を他のアプローチと比較します。
Visual Studio 2005 での厳密に型指定されたデータセットの作成
厳密に型指定されたデータ セットは、実際には通常のデータ セットの事前定義された列とテーブルにすぎないため、コンパイラはそのデータ セットに何が含まれているかをすでに認識しています。野球のグローブのようにフィットする緩いラッパーの代わりに、強く型付けされたデータセットはグローブのようにフィットします。 Visual Studio の以降のバージョンでは、厳密に型指定されたデータ セットの処理が容易になります。次の例では、SQL Server 2005 の AdventureWorks データベースを使用します。次の手順に従ってください。
1. Visual Studio を開き、新しい ASP.NET Web サイトを作成します。
2. ソリューション エクスプローラー ウィンドウで右クリックして新しい項目を追加し、DataSet を選択します。 AdventureWorks.xsd という名前を付けます (スクリーンショットを参照)。 Visual Studio は、DataSet ファイルを App_Code ファイルに入れることを推奨します。[同意する] をクリックするだけで済みます。
3. AdventureWorks.xsd をデザイン モードで開くと、TableAdapter 構成ウィザードが実行されます。この時点で、「キャンセル」をクリックすると、サーバー エクスプローラーから目的のテーブルをドラッグします。
4. サーバー エクスプローラーのツールバーで AdventureWorks データベースを参照します。 (AdventureWorks データベースをインストールしていない場合は、Microsoft のダウンロード ページ SQL Server 2005 サンプルとサンプル データベースに移動して、このデータベースと他の SQL Server 2005 サンプルをダウンロードできます)
5. SalesOrderHeader テーブルと SalesOrderDetail テーブルを DataSet デザイン ウィンドウにドラッグします。ウィンドウはスクリーンショットのように表示されるはずです。私たちは何を見ているのでしょうか?テーブルを追加するたびに、Visual Studio は厳密に型指定された DataTable (元のテーブルと同じ名前) と TableAdapter を作成します。この DataTable は各列を定義しています。 TableAdapter は、テーブルを埋めるために使用するものです。デフォルトでは、元のテーブルから各行のデータを取得する Fill() メソッドがあります。
そのままでは、この厳密に型指定されたデータセットは両方のテーブルからすべてのレコードを返します。しかし、AdventureWorks データベースには多くの注文情報が含まれているため、より明示的なクエリを作成してはどうでしょうか? TableAdapter オブジェクトにメソッドを追加して、特定のサブレコード セットを取得できます。 「SalesORderHeaderTableAdapter」を右クリックし、「追加」→「クエリ」を選択します。 「SQL ステートメントを使用する」を選択して「次へ」をクリックし、「行を返す SELECT」を選択して「次へ」をクリックします。最近、次のクエリをウィンドウに入力します (または、クエリ ビルダーを使用してジョブを実行することもできます)。
選択
SalesOrderID、RevisionNumber、OrderDate、DueDate、ShipDate、
ステータス、OnlineOrderFlag、SalesOrderNumber、PurchaseOrderNumber、
アカウント番号、顧客ID、連絡先ID、営業担当者ID、地域ID、
BillToAddressID、ShipToAddressID、ShipMethodID、CreditCardID、
CreditCardApprovalCode、CurrencyRateID、SubTotal、TaxAmt、Freight、
Sales.SalesOrderHeader からの
TotalDue、Comment、rowguid、ModifiedDate
WHERE (注文日 > @OrderDate)
この SQL クエリは、@OrderDate パラメータを使用して結果をフィルタリングする単純な SELECT クエリです。これにより、データベース内のすべてのレコードを返す手間が省けます。 「Fill a DataTable」チェックボックスと「Return a DataTable」チェックボックスを選択したままにして、「完了」をクリックします。この SELECT ステートメントを追加すると、デザイナーはスクリーンショットのようになり、SalesOrderHeaderTableAdapter の下に追加のクエリが表示されるようになります。
厳密に型指定されたデータ セットが確立されたら、数行のコードで ASP.NET ページにデータを簡単に表示できます。 Web サイトに新しい ASP.NET ページを作成し、デザイン モードに切り替えます。 GridView コントロールをその上にドラッグし、ID を GirdView1 のままにします。次に、ソース コード ページに移動し、ファイルの上に AdventureWorksTableAdapters 名前空間を導入します (C# の構文は AdventureWorksTableAdapters; を使用しています)。最後に、次のコードを Page_Load イベントに追加します。
// SalesOrderHeaderTableAdapter を作成します
SalesOrderHeaderTableAdapter salesAdapter =
new SalesOrderHeaderTableAdapter();
// 2004 年 7 月 1 日以降に行われた注文を取得します。
AdventureWorks.SalesOrderHeaderDataTable 注文 =
salesAdapter.GetDataBy(new DateTime(2004, 7, 1));
// 注文結果を GridView にバインドします。
this.GridView1.DataSource = 注文;
this.GridView1.DataBind();
コードは非常にシンプルです。 SalesORderHeaderTableAdapter のインスタンスを作成して、データ テーブルにデータを設定します。ここで注意すべき点は、通常の DataTable とは異なり、SalesORderHeaderDataTable 型のオブジェクトを宣言し、GetDateBy() メソッドを呼び出し、DateTime オブジェクトを渡してデータを入力することです。また、取得されるコマンドも厳密に型指定されているため、通常のオブジェクトの代わりに DateTime オブジェクトを渡す必要があることにも注意してください。以下のスクリーンショットは、上記のコード例の結果です。
コードを使用して結果セットを GridView にバインドするだけでなく、ObjectDataSource を使用して、その TypeName プロパティを AdventureWorksTableAdapters.SalesOrderHeaderTableAdapter に設定し、その SelectMethod を GetData または GetDataBy に設定することもできます。
データベースに接続するためのコードを記述する必要がないことに加えて、厳密に型指定されたデータセットを使用することのもう 1 つの大きな利点は、コード内にコンパイラーがチェックできない列名の文字列が存在しないことです。型変換を行う必要もありません。データベース スキーマが変更された場合は、AdventureWorks.xsd ファイルを更新するだけで、関連するすべての変更がコンパイル時に自動的に完了することがわかります。
厳密に型指定されたデータ アクセス アプリケーションを生成するためのその他の手法
厳密に型指定されたデータ セットを使用する以外にも、プログラムに強い型指定を実装する方法があります。 DataSet よりも軽量で、データベースとの一貫性が高いカスタム クラスを作成できます。このプロセスを自動化するツールを開発したサードパーティ ソフトウェア開発者もいます。より特別なものの 1 つであり、私のお気に入りは LLBLGen Pro で、これについては以前、『Rapid C# Windows Development: Visual Studio 2005, SQL Server 2005, and LLBLGen Pro』という本を書きました。 (私の Web サイトで本の 1/3 を無料で読むことができます。) もう 1 つの人気のあるツールは CodeSmith です。 Microsoft でさえ、DLINQ と呼ばれる小規模なツールを開発していますが、まだテスト中であり、少なくとも来年まではリリースされないと推定されています。
Visual Studio の強力なデータ セット アプローチを使用する場合、否定できない利点の 1 つは、追加のソフトウェアを購入する必要がないことです。これらのソリューションにはすべて異なる機能と利点がありますが、主な利点は信頼性、エラーの減少、デバッグにかかる時間の短縮です。データベース スキーマの変更による影響の確認やメンテナンスの実行も容易になります。強力な型指定の利点を理解できたことを願っています。開発(そしてデート)も頑張ってください!
ジョセフ・チャンセラー著
添付ファイル
この記事で検証したコードをダウンロードする
著者について
Joseph Chancellor は南カリフォルニアの C# 開発者で、人間関係に関するトラウマをかなり抱えています。彼のブログにアクセスするか、Visual Studio 2005、SQL Server 2005、および SQL Server 2005 に関する本の最初の 5 章を読んでください。 LLBLGen Pro。
元のアドレス: http://aspnet.4guysfromrolla.com/articles/020806-1.aspx