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も同じようにできます。
ページのトップへ戻る