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;
}
}
}