C# DataTableのXMLファイル化
2022-08-28 09:30:35
ローカルDB使ってデータ管理してたけど、ユーザごとにファイル作ってファイル開く/保存の形式にかえました。
ファイルはプログラム内でDataTableをそのまま扱えるように、DataTableをXMLファイルにしてXMLファイルに対して変更を加えるように修正しました。
元のテーブル
IDは自動インクリメント設定してあります。
プログラム
画面
データ確認用の画面です。
Init:DBのUserテーブルをDataTable型でスキーマ付きで取得し、XMLファイルとして保存。画面上は何の変化もなし。
button1:XMLファイルに適当なデータを登録します。
update:XMLファイル内のId=1に対してUpdateDateを更新します。
delete:XMLファイル内のId=2を削除します。
button1、update、deleteを押すと、実行後の内容がテキストエリアに表示されます。表示順は UpdateDateの降順です。
初期表示
update押下時
プログラム
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; using System.IO; using System.Data.SqlClient; namespace DataTableManager { public partial class Form1 : Form { const string DT_FILEPATH_USER = "User.dt"; readonly Encoding UTF16 = Encoding.Unicode; enum UserColum { Id = 0, Name, CreateDate, UpdateDate } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void btn_Init_Click(object sender, EventArgs e) { DataTable table = GetTableData(); SaveUserDtFile(table); OutputTextArea(table); } private void btn_updateUser_Click(object sender, EventArgs e) { DataTable table = new DataTable(); OpenUserDtFile(ref table); UpdateUser(ref table, 1); SaveUserDtFile(table); OutputTextArea(table); } private void btn_deleteUser_Click(object sender, EventArgs e) { DataTable table = new DataTable(); OpenUserDtFile(ref table); DeleteUser(ref table, 2); SaveUserDtFile(table); OutputTextArea(table); } private void button1_Click(object sender, EventArgs e) { DataTable table = new DataTable(); OpenUserDtFile(ref table); //データ書き込み InsertUser(ref table, "あいうえお"); InsertUser(ref table, "将在下次登录后作为显示语言"); InsertUser(ref table, "Höallo, hüeute ist es wieder heiß.ä"); SaveUserDtFile(table); OutputTextArea(table); } private DataTable GetTableData() { // Userテーブルのスキーマ含んだ全カラム・全件を取得している。 // カラムはId, Name, CreateDate, UpdateDateの四つ。 string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;" + @"AttachDbFilename=(MDFファイルのフォルダパス)\SampleDB.mdf;" + @"Integrated Security=true;"; DataTable dataTable = new DataTable(); using (SqlConnection connection = new SqlConnection()) using (SqlCommand cmd = new SqlCommand("SELECT * FROM [User]", connection)) { connection.ConnectionString = connectionString; connection.Open(); SqlDataAdapter da = new SqlDataAdapter(cmd); // SchemaType.Source指定しないとスキーマまで取得できない da.FillSchema(dataTable, SchemaType.Source); connection.Close(); } return dataTable; } private bool OpenUserDtFile(ref DataTable userDt) { userDt = new DataTable(); userDt.ReadXml(DT_FILEPATH_USER); return true; } private bool SaveUserDtFile(DataTable saveDt) { StreamWriter sw = new StreamWriter(DT_FILEPATH_USER, false, UTF16); saveDt.WriteXml(sw, XmlWriteMode.WriteSchema, true); sw.Dispose(); return true; } private bool SelectUserFirstorDefault(DataTable userDt, int selectId, ref DataRow selectRow) { // クエリ形式 selectRow = (from row in userDt.AsEnumerable() where row.Field<int>((int)UserColum.Id) == selectId select row).FirstOrDefault(); return true; // メソッド形式 //selectRow = userDt.AsEnumerable().FirstOrDefault(row => row.Field<int>((int)UserColum.Id) == selectId); //return selectRow; } private bool InsertUser(ref DataTable userDt, string name) { // Idは自動インクリメント設定してあるので、設定しない DataRow row = userDt.NewRow(); row[(int)UserColum.Name] = name; row[(int)UserColum.CreateDate] = DateTime.Now; row[(int)UserColum.UpdateDate] = DateTime.Now; userDt.Rows.Add(row); userDt.AcceptChanges(); return true; } private bool UpdateUser(ref DataTable userDt, int updateId) { DataRow updateRow = userDt.NewRow(); SelectUserFirstorDefault(userDt, updateId, ref updateRow); if (updateRow == null) { return false; } updateRow[(int)UserColum.UpdateDate] = DateTime.Now; userDt.AcceptChanges(); return true; } private bool DeleteUser(ref DataTable userDt, int deleteId) { DataRow deleteRow = userDt.NewRow(); SelectUserFirstorDefault(userDt, deleteId, ref deleteRow); if (deleteRow == null) { return false; } deleteRow.Delete(); userDt.AcceptChanges(); return true; } private bool OrderByUser(DataTable orderDt, ref List<DataRow> orderedRows) { if(orderDt.Rows.Count == 0) { return true; } List<DataRow> query = (from row in orderDt.AsEnumerable() orderby row.Field<DateTime>((int)UserColum.UpdateDate) descending select row).ToList(); orderedRows = query; return true; } private bool OutputTextArea(DataTable outputDt) { StringBuilder sb = new StringBuilder(); List<DataRow> rows = new List<DataRow>(); OrderByUser(outputDt, ref rows); foreach (DataRow row in rows) { sb.Append("Id=" + row[(int)UserColum.Id] + ", "); sb.Append("Name=" + row[(int)UserColum.Name] + ", "); sb.Append("CreateDate=" + row[(int)UserColum.CreateDate] + ", "); sb.AppendLine("UpdateDate=" + row[(int)UserColum.UpdateDate] + ", "); } textBox1.Text = sb.ToString(); return true; } } }