更新の 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(); } } }