ステップ 7 ハンズオン : XML を利用した DataSet の永続化
マイクロソフト株式会社 デベロッパーマーケティング本部
デベロッパーエバンジェリスト 辻郷 隆史
目標 | XML を利用した DataSet の永続化 |
使用技術 |
|
取り上げるトピックス |
|
前提知識 |
|
関連記事 |
|
DataSet データの永続化
DataSet の XML 関連機能を使用することにより、 XML を利用した DataSet の永続化を行うことが可能です。
今回のサンプル アプリケーションでは、DataSet の XML 関連機能を含め、下記の 3 つの機能の実装を行います。
図 1. サンプル アプリケーション
- データベースから DataSet へのデータ設定
- DataSet から XML ドキュメントへの永続化
- XML ドキュメントから DataSet への復元
Visual Studio .NET 2003 を起動して、以下の設定で新規にプロジェクトを作成します。
プロジェクトの種類
|
プロジェクトテンプレート
|
プロジェクト名
|
---|---|---|
[Visual Basic プロジェクト] | [Windows アプリケーション] | DataSetToXmlApp |
アプリケーションのデザインを行います。
ツールボックスから、 Button コントロールを 3 つ、DataGrid コントロールを 1 つ、フォーム上に配置し以下のようにプロパティを設定します。
図 2. アプリケーションのデザイン
コントロール ID
|
プロパティ名
|
設定値
|
---|---|---|
Button1 | Text | (1) データ設定 |
Button2 | Text | (2) 永続化 |
Button3 | Text | (3) 復元 |
アプリケーションの処理を実装します。
フォーム ( Form1.vb) のコードを表示し、 Form1 クラスのメンバーとして、DataSet を定義します。
Public Class Form1
Inherits System.Windows.Forms.Form
Windows フォーム デザイナで生成されたコード
Private myDs As DataSet
End Class
Button1 / Click イベント ハンドラへ、DataSet へのデータ設定の処理を実装します。
Private Sub Button1_Click(…) Handles Button1.Click
Dim myDa As System.Data.SqlClient.SqlDataAdapter
myDa = New System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Products", _
"Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind")
Me.myDs = New DataSet
myDa.Fill(Me.myDs, "Products")
Me.DataGrid1.SetDataBinding(Me.myDs, "Products")
End Sub
永続化を行うデータを DataSet に設定するために、 ADO.NET / SqlDataAdapter クラスを使用し、 SQL Server / Northwind よりサンプルデータを取得しています。
ADO.NET によるデータの取得につきましては、「 10 行でズバリ !! ADO.NET によるデータの取得 」 をご参照ください。
Button2 / Clickイベント ハンドラへ、永続化の処理を実装します。
Private Sub Button2_Click(…) Handles Button2.Click
Me.myDs.WriteXml("myData.xml") ' データの永続化
End Sub
ここでは、 DataSet の WriteXml メソッドを使用し、 myData.xml へ XML ドキュメントを永続化しています。
Button3 / Clickイベント ハンドラへ、復元の処理を実装します。
Private Sub Button3_Click(…) Handles Button3.Click
Me.myDs = New DataSet
Me.myDs.ReadXml("myData.xml") ' データの復元
Me.DataGrid1.SetDataBinding(Me.myDs, "Products")
End Sub
ここでは、 DataSet の ReadXml メソッドを使用し、 myData.xml ファイルの XML ドキュメントを DataSet へ復元しています。
以上で、実装は完了です。では実際にビルドしてアプリケーションを動かしてみましょう。「ビルト」メニューから「ソリューションのビルト」を実行してアプリケーションをビルトします。
問題がなければ、「デバッグ」メニューから「デバッグ無しで開始」を実行します。
アプリケーションにて 「 (1) データ設定 」 ボタンをクリックし、データが DataSet ( DataGrid ) へ設定されていることを確認します。次に、 「 (2) 永続化 」 ボタンをクリックし、 DataSet を XML ドキュメントとして永続化します。
アプリケーションと同一フォルダ内に作成された XML ドキュメント myData.xml を Internet Explorer などで開き、 DataSet のデータが XML ドキュメントとして永続化されていることを確認します。
図 3. 永続化された XML ドキュメント
更に、「 (3) 復元 」 ボタンをクリックし、 XML ドキュメントを DataSet へ復元します。
データとしては、データベースからデータ取得を行った場合と同様のものが設定されますが、 ProductID などの数値列のヘッダーをクリックした際のソート順が、数値としてではなく、文字列としてソートされたり、 Discontinued 列がチェック ボックス表示で無くなったりなど、動作が異なります。
図 4. ソート順の違い
図 5. 表示形式の違い
今回のアプリケーションでは、 DataSet に関する明示的な型指定を行っていないため、 XML ドキュメントの情報を元にデータ型などの型指定が実施されます。
ただし、XML ドキュメントには、各要素のデータ型などのスキーマに関する情報が存在しないため、全て String 型であると解釈し、このような実行結果となります。
この問題を解決するために、次のステップで XML スキーマの情報も併せて永続化することにします。
Bunnon2 / Click イベント プロシージャを下記の通り修正します。
Private Sub Button2_Click(…) Handles Button2.Click
Me.myDs.WriteXml("myData.xml", XmlWriteMode.WriteSchema) ' データの永続化
End Sub
今回の修正では、永続化のため使用している WriteXml メソッドを呼び出す際に、 XmlWriteMode.WriteSchema パラメータを追加で指定しています。
このパラメータを追加することにより、 データを永続化する際に XML ドキュメントに加え、 XML スキーマも同一ファイルへインラインで永続化することが可能となります。
なお、 復元のために使用している ReadXml メソッドでは、デフォルトの動作として同一ファイル内に XML スキーマが存在していた場合は、それを利用してデータ型などの型指定を行います。
修正完了後、ビルドし実行します。
再度、「 (1) データ設定 」「 (2) 永続化 」「 (3) 復元 」 を実行してみます。今度は、正しくデータ型が認識されているため、いずれも同様の動作となることが確認できます。
更に、 myData.xml ファイルを確認すると XML ドキュメントの前方に、 XML スキーマが存在していることが確認できます。
図 6. 永続化された XML スキーマおよび XML ドキュメント
【個別ファイルへの XML スキーマの永続化】
XML ドキュメントのファイルとは別ファイルへ XML スキーマを永続化する場合は、下記の通り WriteXmlSchema / ReadXmlSchema を使用することにより可能となります。
Private Sub Button2_Click(…) Handles Button2.Click
Me.myDs.WriteXmlSchema("mySchema.xml")
Me.myDs.WriteXml("myData.xml") ' データの永続化
End Sub
Private Sub Button3_Click(…) Handles Button3.Click
Me.myDs = New DataSet
Me.myDs.ReadXmlSchema("mySchema.xml")
Me.myDs.ReadXml("myData.xml") ' データの復元
Me.DataGrid1.SetDataBinding(Me.myDs, "Products")
End Sub
まとめ
DataSet のXML 関連機能をを利用することにより、 DataSet の永続化を行うことが可能です。
また、 XML スキーマを永続化する必要がある場合も、インラインまたは個別ファイルとして永続化を行うこと可能です。
このように .NET Framework では、 XML を利用した DataSet データの永続化を効率良く行うことが可能です。
参考資料
- .NET Framework 開発者ガイド / XML と DataSet
ページのトップへ