更新の SQL を作成せずに、DataRow オブジェクトの中のフィールドに対して個別にデータをセットします。ここでは、 System.Data.SqlClient を使用していますが、OleDb や Odbc でも同じです。 ▼ DataAdapter を使用した更新方法のサンプル DataAdapter.Update(DataSet) Method ▼ 列にデータをセットする方法のサンプル DataColumn Class ▼ 各オブジェクトの参照方法のサンプル DataSet.Tables Property ▼ 接続からの全体像 DataSet Class ▼ DataSet 内の Table と言う名称について 複数のselect文をまとめて実行するには?
using System;
using System.Data;
using System.Data.SqlClient;
namespace DBUpdate1
{
class Program
{
static void Main(string[] args)
{
DataSet dataSet = new DataSet();
string connectionString;
string queryString = "select * from 社員マスタ where 社員コード = '0001'";
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
// 接続用のパラメータを追加
builder.Add("Data Source", "layla");
builder.Add("Initial Catalog", "lightbox");
builder.Add("User ID", "sa");
builder.Add("Password", "");
// 接続文字列を取得
connectionString = builder.ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
// 接続
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter();
// 参照用のマップを追加
adapter.TableMappings.Add("Table", "社員マスタ");
// SQL 作成
SqlCommand command = new SqlCommand(queryString,connection);
command.CommandType = CommandType.Text;
adapter.SelectCommand = command;
// 更新用のオブジェクトを準備
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
// データを取り出す
adapter.Fill(dataSet);
// テーブルを取得
DataTable dataTable = dataSet.Tables["社員マスタ"];
// 行と列の数( ここでは行は 1 )
Console.WriteLine($"行数 : {dataTable.Rows.Count}");
Console.WriteLine($"列数 : {dataTable.Columns.Count}");
// 行
DataRow row = dataTable.Rows[0];
// 列の定義
DataColumn column = dataTable.Columns["氏名"];
Console.WriteLine($"氏名 : {column.DataType.ToString()}");
column = dataTable.Columns["給与"];
Console.WriteLine($"給与 : {column.DataType.ToString()}");
column = dataTable.Columns["手当"];
Console.WriteLine($"手当 : {column.DataType.ToString()}");
column = dataTable.Columns["生年月日"];
Console.WriteLine($"生年月日 : {column.DataType.ToString()}");
// 列の正確なデータの取り出し
string simei = row.Field<string>("氏名");
Console.WriteLine(simei);
int kyuyo = row.Field<int>("給与");
Console.WriteLine(kyuyo);
DateTime birth = row.Field<DateTime>("生年月日");
Console.WriteLine($"{birth.ToShortDateString()}");
// データのセット
row["氏名"] = "山田 太郎";
// 整数のセット
row["給与"] = 10000;
// NULL のセット
row["手当"] = DBNull.Value;
// 日付のセット
row["生年月日"] = DateTime.Parse("1999/01/02");
// 更新用のコマンドを取得
adapter.UpdateCommand = commandBuilder.GetUpdateCommand();
// 更新実行
adapter.Update(dataSet);
}
// 一時停止
Console.ReadLine();
}
}
}
更新の無い場合のデータ読み出し 接続準備等は同じなので、パラメータのセットの仕方を別バリエーションで行っています。
using System;
using System.Data.SqlClient;
namespace DBSelect
{
class Program
{
static void Main(string[] args)
{
string connectionString;
string queryString = "select * from 社員マスタ order by 社員コード";
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
// 接続用のパラメータを追加
builder.Add("Data Source", "layla");
builder.Add("Initial Catalog", "lightbox");
builder.Add("User ID", "sa");
builder.Add("Password", "");
// 接続文字列を取得
connectionString = builder.ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand())
{
// *********************
// 接続
// *********************
connection.Open();
// コマンドオブジェクトに接続をセット
command.Connection = connection;
// コマンドを通常 SQL用に変更
command.CommandType = System.Data.CommandType.Text;
// *********************
// 実行 SQL
// *********************
command.CommandText = queryString;
// *********************
// レコードセット取得
// *********************
using (SqlDataReader reader = command.ExecuteReader())
{
// *********************
// 列数
// *********************
int nCols = reader.FieldCount;
// データ取得と表示
int row_cnt = 0;
while (reader.Read())
{
row_cnt++;
// 初回のみ、タイトル文字列を設定
if (row_cnt == 1)
{
for (int idx = 0; idx < nCols; idx++)
{
Console.Write($"{reader.GetName(idx)} ");
}
Console.WriteLine();
}
// 行データ
for (int idx = 0; idx < nCols; idx++)
{
// NULL でない場合
if (!reader.IsDBNull(idx))
{
// 列のデータ型を取得
Type fldType = reader.GetFieldType(idx);
// 文字列
if (fldType.Name == "String")
{
Console.Write($"{reader.GetValue(idx).ToString()} ");
}
else if (fldType.Name == "Int32")
{
Console.Write($"{reader.GetInt32(idx)} ");
}
else if (fldType.Name == "DateTime")
{
Console.Write($"{reader.GetDateTime(idx).ToShortDateString()} ");
}
else
{
Console.Write($"{reader.GetValue(idx).ToString()}");
}
}
}
Console.WriteLine();
}
// リーダを使い終わったので閉じる
reader.Close();
connection.Close();
}
} // 最外の using の終わり
Console.ReadLine();
}
}
}