【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(sqlConStrBuilder.toString());
            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(sqlConStrBuilder.toString());
            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時のインスタンスが別々になるので、実行時エラーではじかれてしまいます!

お気を付けください!

2 件のコメント

  • 私は本当の初心者です。上記のコードを学ばねばと見よう見まねで、C#にコードを書いています。そこで上記のコードの中で
    SqlCon = new SqlConnection(SqlSetting.ConnectionString);の SqlSetting の文字列でエラーが発生するので教えていただけますでしょうか。お忙しいところ恐縮です。個人的にですが、データベースプログラムに興味がありますが、独学・高年齢でなかなか理解が追いつきませんが、好きです。今後ともよろしくお願いいたします。

    • コメントありがとうございます!
      最近放置気味だったため、返信が遅れてしまいすみません。。。

      こちらコードを確認したところ、
      SqlCon = new SqlConnection(SqlSetting.ConnectionString);
      は誤りですね!
      SqlCon = new SqlConnection(sqlConStrBuilder.toString());
      でコンパイルエラーは消えると思われます!!

      高年齢で独学でもプログラミングができるようになった方はいるので、頑張ってください!!

  • コメントを残す

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

    CAPTCHA