| ■No88334 (河童 さん) に返信 > ds.WriteXml(xmlFile);
上記は ds.WriteXml(xmlFile, XmlWriteMode.IgnoreSchema); と同義になります。
データの比較だけではなく、データ型まで含めて比較する必要があるのなら、 ds.WriteXml(xmlFile, XmlWriteMode.WriteSchema); のようにした方が良いかも知れません。
これは上記 No88339 で述べた public int user_id { get; set; } public string user_id { get; set; } なデータを区別する必要がある場合に役に立ちます。 今回は DataTable なので、 dt.Columns.Add("user_id", typeof(int)); dt.Columns.Add("user_id", typeof(string)); の違いを考慮する必要があるかどうか、という意味です。
あるいは、スキーマの同一性は保証されていて、 複数のデータベース間でのデータ同期(バッチ更新処理)が目的なら、 ds.WriteXml(xmlFile, XmlWriteMode.DiffGram); の方が良いこともあります。 参考までに、DiffGram を指定した場合との違いを示しておきます。
DataSet ds = new DataSet(); DataTable dt = ds.Tables.Add("m_user"); dt.Columns.Add("user_id"); dt.Columns.Add("user_name"); dt.PrimaryKey = new DataColumn[] { dt.Columns["user_id"] }; dt.Rows.Add("100", "ジャレコ"); dt.Rows.Add("200", "山梨シルクセンター"); // // この時点では、2 行とも「新規追加行」なので // dt.Rows[0].RowState は Added // dt.Rows[1].RowState は Added // という状態です。 //
ds.AcceptChanges(); // 変更を確定 // // この時点では、変更が確定されているため、 // dt.Rows[0].RowState は Unchanged // dt.Rows[1].RowState は Unchanged // すなわち「未変更」状態です。 // データベースから SELECT した直後のデータは、通常この状態となります。 // // 何らかの理由で DataSet を手動で構築しなければならない場合には、 // このように AcceptChanges を呼んでおき、未編集状態である // Unchanged にしておいた方が良いでしょう。
// 100 番のレコード "ジャレコ" を削除状態にする dt.Rows.Find("100").Delete();
// 200 番の名前を、"山梨シルクセンター" から "サンリオ" に変更 dt.Rows.Find("200")["user_name"] = "サンリオ";
// 上記の編集により、各行の RowState は // dt.Rows[0].RowState は Deleted // dt.Rows[1].RowState は Modified // に変化しています。
// 例1:編集履歴は失われ、DataSet 上の最後の状態のみが出力されます ds.WriteXml(xmlFile1);
// 例2:復元時に RowState の状態まで維持されます。 ds.WriteXml(xmlFile2, XmlWriteMode.DiffGram);
【例1の出力結果】… dt.Rows.Count は 2 件だったが、出力結果は 1 件のみとなる <?xml version="1.0" standalone="yes"?> <NewDataSet> <m_user> <user_id>200</user_id> <user_name>サンリオ</user_name> </m_user> </NewDataSet>
【例2の出力結果】… 編集前の値も保持されている <?xml version="1.0" standalone="yes"?> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <NewDataSet> <m_user diffgr:id="m_user2" msdata:rowOrder="1" diffgr:hasChanges="modified"> <user_id>200</user_id> <user_name>サンリオ</user_name> </m_user> </NewDataSet> <diffgr:before> <m_user diffgr:id="m_user1" msdata:rowOrder="0"> <user_id>100</user_id> <user_name>ジャレコ</user_name> </m_user> <m_user diffgr:id="m_user2" msdata:rowOrder="1"> <user_id>200</user_id> <user_name>山梨シルクセンター</user_name> </m_user> </diffgr:before> </diffgr:diffgram> |