ローカルデータベースのファイル保存、読み出し

2024年2月20日

ローカルデータベースのファイル保存と読み込みについてみてきましょう。具体的に、C#言語を使用して、DataSetをファイルに保存し、保存されたファイルからDataSetを読み込む方法になります

DataSetのファイル保存読み出し

DataSetをファイルに保存

// DataSetをXML形式でファイルに書き込む
bookDataSet.WriteXml("bookData.xml");

保存したファイルからDataSetへの読み込み

// データが重複しないようにクリアしておく
bookDataSet.bookDataTable.Clear();

// xmlスキーマとデータを読み取りDataSetに取り込む
bookDataSet.ReadXml("bookData.xml");

// DataGridViewにセット
bookDataGrid.DataSource = bookDataSet;

// DataGridViewで表示されるデータの対象テーブルをセット
bookDataGrid.DataMember = "bookDataTable";

全体のサンプルコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BookManager
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            bookDataSet.bookDataTable.AddbookDataTableRow(
                 "車辞典",
                 "車太郎",
                 1000
             );
            bookDataSet.bookDataTable.AddbookDataTableRow(
                "車大百科",
                "車次郎",
                2000
            );
            bookDataSet.bookDataTable.AddbookDataTableRow(
                "楽しい車",
                "車太郎",
                3000
            );
            bookDataSet.bookDataTable.AddbookDataTableRow(
                "楽しい飛行機",
                "飛行機太郎",
                4000
            );
            DataRow row = bookDataSet.bookDataTable.NewRow();
            row["書名"] = "楽しい海水浴";
            row["著者"] = "近藤正美";
            row["値段"] = 5000;
            bookDataSet.Tables["bookDataTable"].Rows.Add(row);
            // LINQを使ってデータを抽出
            DataRow[] dRows = bookDataSet.bookDataTable.AsEnumerable()
                .Where(r => r.Field<string>("書名") == "楽しい海水浴").ToArray();
            // データテーブルのコピーを作成
            DataTable sortedDataTable = bookDataSet.bookDataTable.Clone();
            DataView dataView = bookDataSet.bookDataTable.DefaultView;
            dataView.Sort = "著者";
            foreach (DataRowView dataRowView in dataView)
            {
                sortedDataTable.ImportRow(dataRowView.Row);
            }
            //bookDataSet.bookDataTable[0][0] = "楽しいキャンプ";
            //bookDataSet.bookDataTable[0]["著者"] = "木村";
            DataRow[] dataRows = bookDataSet.Tables["bookDataTable"]
                                            .Select("著者 = '車太郎'");
            DataRow[] dataRows1 = bookDataSet.Tables["bookDataTable"]
                                            .Select("著者 LIKE '車%'");
        }
        private void AddButtonClicked(object sender, EventArgs e)
        {
            // DataTableにデータを追加する
            bookDataSet.bookDataTable.AddbookDataTableRow(
                this.bookName.Text,
                this.author.Text,
                int.Parse(this.price.Text)
            );
            //bookDataSet.Tables["bookDataTable"].Rows[0].Delete();
        }
        private void RemoveButtonClicked(object sender, EventArgs e)
        {
            // 選択した行のデータを削除する
            int row = this.bookDataGrid.CurrentRow.Index;
            this.bookDataGrid.Rows.RemoveAt(row);
        }
        private void SaveButton_Click(object sender, EventArgs e)
        {
            // DataSetをXML形式でファイルに書き込む
            bookDataSet.WriteXml("bookData.xml");
        }
        private void LoadButton_Click(object sender, EventArgs e)
        {
            // テーブルをクリア
            bookDataSet.bookDataTable.Clear();
            // xmlスキーマとデータを読み取りDataSetに取り込む
            bookDataSet.ReadXml("bookData.xml");
            // DataGridViewで表示されるデータセットの取得
            bookDataGrid.DataSource = bookDataSet;
            // DataGridViewで表示されるデータの対象テーブルをセット
            bookDataGrid.DataMember = "bookDataTable";
        }
        private void ShowXMLButton_Click(object sender, EventArgs e)
        {
            // DataGridViewに読み込んだデータ構造の表示
            using (var swXML = new StringWriter())
            {
                bookDataSet.WriteXmlSchema(swXML);
                xmlTextBox.Text = swXML.ToString();
            }
        }
    }

参考

xmlスキーマの確認

TextBoxをひとつ作成して、表示させています

// DataGridViewに読み込んだデータ構造の表示
using (var swXML = new StringWriter())
{
    bookDataSet.WriteXmlSchema(swXML);
    xmlTextBox.Text = swXML.ToString();
}

xmlスキーマのサンプル

<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="BookDataSet" targetNamespace="http://tempuri.org/BookDataSet.xsd" xmlns:mstns="http://tempuri.org/BookDataSet.xsd" xmlns="http://tempuri.org/BookDataSet.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
  <xs:element name="BookDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="bookDataTable">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="書名" type="xs:string" minOccurs="0" />
              <xs:element name="著者" type="xs:string" minOccurs="0" />
              <xs:element name="値段" type="xs:int" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

xmlファイルのサンプル

保存されたデータのサンプル

<?xml version="1.0" standalone="yes"?>
<BookDataSet xmlns="http://tempuri.org/BookDataSet.xsd">
  <bookDataTable>
    <書名>車辞典</書名>
    <著者>車太郎</著者>
    <値段>1000</値段>
  </bookDataTable>
  <bookDataTable>
    <書名>車大百科</書名>
    <著者>車次郎</著者>
    <値段>2000</値段>
  </bookDataTable>
  <bookDataTable>
    <書名>楽しい車</書名>
    <著者>車太郎</著者>
    <値段>3000</値段>
  </bookDataTable>
  <bookDataTable>
    <書名>楽しい飛行機</書名>
    <著者>飛行機太郎</著者>
    <値段>4000</値段>
  </bookDataTable>
  <bookDataTable>
    <書名>楽しい海水浴</書名>
    <著者>近藤正美</著者>
    <値段>5000</値段>
  </bookDataTable>
</BookDataSet>

C#,XML,データベース

Posted by hidepon