nyaou.com

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;

        }


    }
}

このエントリーをはてなブックマークに追加

当サイトは管理人「まだこ」による様々なジャンルのレビューサイトです。

ご連絡は、TwitterFacebook でお願いします。