ステップ 7 ハンズオン : XML を利用した DataSet の永続化

マイクロソフト株式会社 デベロッパーマーケティング本部
デベロッパーエバンジェリスト 辻郷 隆史

目標 XML を利用した DataSet の永続化
使用技術
  • ADO.NET
  • Visual Basic .NET / Windows フォーム
取り上げるトピックス
  • DataSet の永続化および復元方法
  • DataSet XML スキーマの永続化および復元方法
前提知識
関連記事

DataSet データの永続化

DataSet の XML 関連機能を使用することにより、 XML を利用した DataSet の永続化を行うことが可能です。
今回のサンプル アプリケーションでは、DataSet の XML 関連機能を含め、下記の 3 つの機能の実装を行います。

図 1. サンプル アプリケーション

  1. データベースから DataSet へのデータ設定
  2. DataSet から XML ドキュメントへの永続化
  3. 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

ページのトップへ