【C#】DataAdapterを使ってFillとUpdateしてみる

この記事は約 3 分で読めます。

みなさんこんにちは!ヒロポンです!

今回はアプリ制作と切っては切り離せない関係にあるDatabaseからデータを取得する方法の中から、DataAdapterを使ったDataTableを取得する方法について書いていきたいと思います!

割とベーシックな取得方法なので、是非この機会に覚えてくれればと思います!

では早速

参考コード

コードの全貌

    public partial class Form2 : Form
    {
        private SqlConnection SqlCon;
        private SqlDataAdapter adapter;
        private SqlCommandBuilder commandBuilder;

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            SqlSettingInitialize();
        }

        private void SqlSettingInitialize()
        {
            var sqlConStrBuilder = new SqlConnectionStringBuilder();
            sqlConStrBuilder.InitialCatalog = @"testDb";
            sqlConStrBuilder.DataSource = @"DESKTOP-B9V2BO1";
            sqlConStrBuilder.UserID = "sa";
            sqlConStrBuilder.Password = "pass";
            sqlConStrBuilder.ConnectTimeout = 10;

            var selectQuery = @"select * from dbo.test";

            SqlCon = new SqlConnection(SqlSetting.ConnectionString);
            adapter = new SqlDataAdapter(selectQuery, SqlCon);
            commandBuilder = new SqlCommandBuilder(adapter);
            adapter.UpdateCommand = commandBuilder.GetUpdateCommand();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var dt = new DataTable();
            SqlCon.Open();
            adapter.Fill(dt);
            SqlCon.Close();
            dataGridView1.DataSource = dt;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var updateDt = (DataTable) dataGridView1.DataSource;
            SqlCon.Open();
            adapter.Update(updateDt);
            SqlCon.Close();
        }
    }

Formロード時にインスタンスを生成

dataAdapterを使ってFillとUpdateを行うのに重要なのは、同じインスタンスを使わないといけないということ。

なので、Formにインスタンスを持たせておきます。

    public partial class Form2 : Form
    {
        private SqlConnection SqlCon;
        private SqlDataAdapter adapter;
        private SqlCommandBuilder commandBuilder;

またフォームロード時にインスタンスをまとめて生成します。

        private void SqlSettingInitialize()
        {
            var sqlConStrBuilder = new SqlConnectionStringBuilder();
            sqlConStrBuilder.InitialCatalog = @"testDb";
            sqlConStrBuilder.DataSource = @"DESKTOP-B9V2BO1";
            sqlConStrBuilder.UserID = "sa";
            sqlConStrBuilder.Password = "pass";
            sqlConStrBuilder.ConnectTimeout = 10;

            var selectQuery = @"select * from dbo.test";

            SqlCon = new SqlConnection(SqlSetting.ConnectionString);
            adapter = new SqlDataAdapter(selectQuery, SqlCon);
            commandBuilder = new SqlCommandBuilder(adapter);
            adapter.UpdateCommand = commandBuilder.GetUpdateCommand();
        }

Fill

データを取得したいときはFillで取得します。

        private void button1_Click(object sender, EventArgs e)
        {
            var dt = new DataTable();
            SqlCon.Open();
            adapter.Fill(dt);
            SqlCon.Close();
            dataGridView1.DataSource = dt;
        }

Update

更新はそのままUpdateメソッドを使います。

        private void button2_Click(object sender, EventArgs e)
        {
            var updateDt = (DataTable) dataGridView1.DataSource;
            SqlCon.Open();
            adapter.Update(updateDt);
            SqlCon.Close();
        }

重要なのはインスタンスを破棄しないこと

今回のソースで重要なのはAdapterクラスのインスタンスを破棄しないことです。

usingとかを使って破棄してしまうと、データ取得時のインスタンスと、update時のインスタンスが別々になるので、実行時エラーではじかれてしまいます!

お気を付けください!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA