DataSet クラス (System.Data)
XMLの読み込み/書き込み
[C#]
// 読み込み対象ファイルパス string fileName = @"c:\xmlDataSet.xml"; // XMLファイルの読み込み xmlDataSet.ReadXml(fileName);
[C#]
// 書き込み対象ファイルパス string fileName = @"c:\xmlDataSet.xml"; // XMLファイルの書き込み xmlDataSet.WriteXml(fileName);
未知のXML形式から型付データセット用にXSDを生成
[C#]
// 未知のXML形式ファイルパス string xmlFileName = @"c:\xmlDataSet.xml"; // XSDファイルパス string xsdFileName = @"c:\xmlDataSet.xsd"; // XMLファイルの読み込み xmlDataSet.ReadXml(xmlFileName ); // XSDファイルの書き込み xmlDataSet.WriteXmlSchema(xsdFileName);
XSDファイルは Visual Studio にドラッグアンドドロップすることで型付データセットを生成できる。
また、型付データセット内の余分な DataTable を削除して、型付データセットを利用して ReadXml() を行うことで、余分なテーブルデータをスキップしてXMLファイルを読み込むことができる。
DataTableのソート
DataTableのソートは、DataViewのSort機能を利用して行うことができる。しかし、型付DataSetの場合は、DataViewによってソートを行いToTable()メソッドで結果を得ようとすると、ToTable()メソッドはDataTable型を返却するため、ソートを行った以降の処理で型付DataSetによって自動生成されたコードの恩恵を受けられなくなってしまう。
ここでは、ジェネリックメソッドを実装して、型付DataSetのDataTableを型付のままソートする方法を紹介する。
[VB]
Imports System Imports System.Data Module SampleAppVB Public Function SortTable(Of T As DataTable)( _ ByVal source As T, ByVal expression As String) As T ' データテーブルのコピーを作成 Dim dest As T = CType(source.Clone(), T) ' ソートされたデータビューの作成 Dim dv As DataView = New DataView(source) dv.Sort = expression ' ソートされたレコードのコピー For Each drv As DataRowView In dv dest.ImportRow(drv.Row) Next Return dest End Function End Module
[C#]
using System; using System.Data; namespace SampleApplicationCS { public class SampleAppCS { public static T SortTable<T>(T source, string expression) where T : System.Data.DataTable { // データテーブルのコピーを作成 T dest = (T)source.Clone(); // ソートされたデータビューの作成 DataView dv = new DataView(source); dv.Sort = expression; // ソートされたレコードのコピー foreach (DataRowView drv in dv) { dest.ImportRow(drv.Row); } return dest; } } }
[C++]
using namespace System; using namespace System::Data; generic<typename T> where T: System::Data::DataTable T SortTable(T source, String^ expression) { // データテーブルのコピーを作成 T dest = (T)source->Clone(); // ソートされたデータビューの作成 DataView^ dv = gcnew DataView(source); dv->Sort = expression; // ソートされたレコードのコピー for each (DataRowView^ drv in dv) { dest->ImportRow(drv->Row); } return dest; }