トッカンソフトウェア

C# ADO.NET UPDATE

C#でADO.NETでINSERT、UPDATE、DELETEを行ってみます。
前回前々回をベースに行うので、そちらも参照下さい。

UPDATEのサンプル

				
using Npgsql;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var connString = "Host=localhost;Port=5432;Username=postgres;Password=ps;Database=postgres";

            using (var conn = new NpgsqlConnection(connString))
            {
                conn.Open();

                using (var da = new NpgsqlDataAdapter("select * from m_user", conn))
                {
                    NpgsqlCommandBuilder cb = new NpgsqlCommandBuilder(da);
                    SelectTest(da, "変更前");
                    UpdateTest(da);
                    SelectTest(da, "変更後");
                }
            }
        }
        static void UpdateTest(DbDataAdapter da)
        {
            var dataSet = new DataSet();
            da.Fill(dataSet, "TBL");

            DataTable tbl = dataSet.Tables[0];

            //新規追加
            DataRow rowA = tbl.NewRow();
            rowA["id"] = "test3";
            rowA["name"] = "新規";
            tbl.Rows.Add(rowA);

            //更新
            DataRow[] rowU = tbl.Select("id = 'test1'");
            rowU[0]["name"] = "更新";

            //削除
            DataRow[] rowD = tbl.Select("id = 'test2'");
            rowD[0].Delete();

            //DBに反映
            da.Update(tbl);
        }

        static void SelectTest(DbDataAdapter da, string msg)
        {
            Console.WriteLine(msg);

            var dataSet = new DataSet();
            da.Fill(dataSet, "TBL");
            var cols = new List<string>();
            foreach (DataColumn col in dataSet.Tables["TBL"].Columns)
            {
                cols.Add(col.Caption);
            }
            foreach (DataRow row in dataSet.Tables[0].Rows)
            {
                int idx = 0;
                foreach (string col in cols)
                {
                    Console.Write(row[idx++]);
                    Console.Write("\t");
                }
                Console.WriteLine("");
            }
        }
    }
}


			


実行イメージ


生成したDataAdapterに対し、CommandBuilderを生成すると、データの更新(INSERT、UPDATE、DELETE)ができるようになります。

今回のサンプルは、PostgreSQLなのでNpgsqlCommandBuilderを使用していますが、OracleではOracleCommandBuilder、SQLServerではSqlCommandBuilderを使用します(未検証)。


実行コマンドの表示


using Npgsql;
using System;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var connString = "Host=localhost;Port=5432;Username=postgres;Password=ps;Database=postgres";

            using (var conn = new NpgsqlConnection(connString))
            {
                conn.Open();

                using (var da = new NpgsqlDataAdapter("select * from m_user", conn))
                {
                    NpgsqlCommandBuilder cb = new NpgsqlCommandBuilder(da);
                    Console.WriteLine(cb.GetInsertCommand().CommandText + "\r\n");
                    Console.WriteLine(cb.GetUpdateCommand().CommandText + "\r\n");
                    Console.WriteLine(cb.GetDeleteCommand().CommandText + "\r\n");
                }
            }
        }
    }
}



実行イメージ


実行されるSQLは、GetInsertCommand、GetUpdateCommand、GetDeleteCommandで確認することができます。

実行コマンドのセット

CommandTextにSQLをセットすることで、実行するSQLを変更することができます。

using Npgsql;
using NpgsqlTypes;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var connString = "Host=localhost;Port=5432;Username=postgres;Password=ps;Database=postgres";

            using (var conn = new NpgsqlConnection(connString))
            {
                conn.Open();

                using (var da = new NpgsqlDataAdapter("select * from m_user", conn))
                {
                    NpgsqlCommand cmd = new NpgsqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = "INSERT INTO m_user(id, name) VALUES(@id, @name)";
                    cmd.Parameters.Add(new NpgsqlParameter("@id", NpgsqlDbType.Text, 0, "id"));
                    cmd.Parameters.Add(new NpgsqlParameter("@name", NpgsqlDbType.Text, 0, "name"));
                    da.InsertCommand = cmd;

                    SelectTest(da, "変更前");
                    UpdateTest(da);
                    SelectTest(da, "変更後");
                }
            }
        }
        static void UpdateTest(DbDataAdapter da)
        {


            var dataSet = new DataSet();
            da.Fill(dataSet, "TBL");

            DataTable tbl = dataSet.Tables[0];

            //新規追加
            DataRow rowA = tbl.NewRow();
            rowA["id"] = "test4";
            rowA["name"] = "新規";
            tbl.Rows.Add(rowA);

            //DBに反映
            da.Update(tbl);
        }

        static void SelectTest(DbDataAdapter da, string msg)
        {
            Console.WriteLine(msg);

            var dataSet = new DataSet();
            da.Fill(dataSet, "TBL");
            var cols = new List<string>();
            foreach (DataColumn col in dataSet.Tables["TBL"].Columns)
            {
                cols.Add(col.Caption);
            }
            foreach (DataRow row in dataSet.Tables[0].Rows)
            {
                int idx = 0;
                foreach (string col in cols)
                {
                    Console.Write(row[idx++]);
                    Console.Write("\t");
                }
                Console.WriteLine("");
            }
        }
    }
}

UPDATEもDELETEも同じようにできます。





ページのトップへ戻る