読者です 読者をやめる 読者になる 読者になる

kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

データセットを使用したレコード登録・更新・削除

Visual C#.NETのお勉強中です。DB操作には「データセット」というものを良く使うようですが、よくわかっていないので勉強してみました。

作成したサンプルアプリの画面イメージです。

使用したテーブルです。

drop table Table01;
create table Table01 (
	Id int IDENTITY PRIMARY KEY,
	Nchar1 nchar(100),
	Nvarchar1 nvarchar(1000),
	Ntext1 ntext,
	Numeric1 numeric(10,0),
	Numeric2 numeric(10,2),
	Int1 int,
	Float1 float,
	Datetime1 datetime,
	CreateDatetime datetime NOT NULL,
	UpdateDatetime datetime NOT NULL
);

レコードの登録・更新・削除を行うソース部分です。

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace Sqlce01
{
    public partial class Form1 : Form
    {
        private const string APP_NAME = "Sqlce01";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: このコード行はデータを 'sqlce01DataSet1.Table01' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
            this.table01TableAdapter.Fill(this.sqlce01DataSet.Table01);
        }

        private void buttonInsert_Click(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;

            // 新規レコードオブジェクト作成
            Sqlce01DataSet.Table01Row row = sqlce01DataSet.Table01.NewTable01Row();
            row.Nchar1 = textBoxNchar1.Text;
            row.Nvarchar1 = textBoxNvarchar1.Text;
            row.Ntext1 = textBoxNtext.Text;
            row.Numeric1 = numericUpDownNumeric1.Value;
            row.Numeric2 = numericUpDownNumeric2.Value;
            row.Int1 = (int)numericUpDownInt1.Value;
            row.Float1 = (float)numericUpDownFloat1.Value;
            row.Datetime1 = dateTimePickerDatetime1.Value;
            row.CreateDatetime = now;
            row.UpdateDatetime = now;
            sqlce01DataSet.Table01.AddTable01Row(row);

            // DB反映
            int result = table01TableAdapter.Update(sqlce01DataSet);
            Debug.WriteLine("レコード登録結果=" + result);

            // 画面反映
            this.table01TableAdapter.Fill(this.sqlce01DataSet.Table01);
            dataGridView1.Refresh();
            CopyToForm(null);
        }

        private void buttonUpdate_Click(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;

            // レコード更新
            // 主キーに対して自動生成されるFindByXxxを使用して、レコードを特定しています。
            int id = Int32.Parse(textBoxId.Text);
            Sqlce01DataSet.Table01Row row = sqlce01DataSet.Table01.FindById(id);
            row.Nchar1 = textBoxNchar1.Text;
            row.Nvarchar1 = textBoxNvarchar1.Text;
            row.Ntext1 = textBoxNtext.Text;
            row.Numeric1 = numericUpDownNumeric1.Value;
            row.Numeric2 = numericUpDownNumeric2.Value;
            row.Int1 = (int)numericUpDownInt1.Value;
            row.Float1 = (float)numericUpDownFloat1.Value;
            if (dateTimePickerDatetime1.Checked)
            {
                row.Datetime1 = dateTimePickerDatetime1.Value;
            }
            else
            {
                row.SetDatetime1Null();
            }
            row.UpdateDatetime = now;

            // DB反映
            int result = table01TableAdapter.Update(sqlce01DataSet);
            Debug.WriteLine("レコード更新結果=" + result);

            // 画面反映
            this.table01TableAdapter.Fill(this.sqlce01DataSet.Table01);
            dataGridView1.Refresh();
            CopyToForm(null);
        }

        private void buttonDelete_Click(object sender, EventArgs e)
        {
            // レコード削除
            // 主キーに対して自動生成されるFindByXxxを使用して、レコードを特定しています。
            int id = Int32.Parse(textBoxId.Text);
            Sqlce01DataSet.Table01Row row = sqlce01DataSet.Table01.FindById(id);
            row.Delete();

            // DB反映
            int result = table01TableAdapter.Update(sqlce01DataSet);
            Debug.WriteLine("レコード削除結果=" + result);

            // 画面反映
            this.table01TableAdapter.Fill(this.sqlce01DataSet.Table01);
            dataGridView1.Refresh();
            CopyToForm(null);
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            Sqlce01DataSet.Table01Row row = null;

            // 選択行のレコードを取得する。
            DataGridViewRow selectedRow = dataGridView1.Rows[e.RowIndex];
            if (selectedRow.Cells[0].Value != null && !string.IsNullOrEmpty(selectedRow.Cells[0].Value.ToString()))
            {
                int id = (int)selectedRow.Cells[0].Value;
                row = sqlce01DataSet.Table01.FindById(id);
            }

            // データを画面表示する。
            CopyToForm(row);
        }

        private void CopyToForm(Sqlce01DataSet.Table01Row row)
        {
            DateTime now = DateTime.Now;

            textBoxId.Text = row == null ? "": row.Id.ToString();
            textBoxNchar1.Text = row == null ? "": row.Nchar1;
            textBoxNvarchar1.Text = row == null ? "": row.Nvarchar1;
            textBoxNtext.Text = row == null ? "": row.Ntext1;
            numericUpDownNumeric1.Value = row == null ? 0: row.Numeric1;
            numericUpDownNumeric2.Value = row == null ? 0: row.Numeric2;
            numericUpDownInt1.Value = row == null ? 0: row.Int1;
            numericUpDownFloat1.Value = row == null ? 0: Decimal.Parse(row.Float1.ToString());
            dateTimePickerDatetime1.Value = row == null || row.IsDatetime1Null() ? now : row.Datetime1;
            dateTimePickerDatetime1.Checked = row == null ? false : !row.IsDatetime1Null();
            textBoxCreateDatetime.Text = row == null ? "": row.CreateDatetime.ToString();
            textBoxUpdateDatetime.Text = row == null ? "": row.UpdateDatetime.ToString();
        }
    }
}

動作環境