前回の記事では、SQL Server (LocalDB) に作成したテーブルからSELECT文を実行してデータを取得する方法を解説しました。
今回はテーブルに対して直接UPDATE・INSERT・DELETE文を実行する方法を解説します。
環境
- Visual Studio 2022
- .NET 8
※今回使用するテーブルです。SQL Serverへの接続方法や、テーブルの作成やテストデータの登録方法については上記の記事を参照してください。
プログラム全文
テーブルのデータを更新・挿入・削除するプログラムです。
※.NET 6以降の最上位レベルのステートメントを使っています。下記コードをコンソールアプリのProgram.cs
に貼り付けるだけで実行可能です。
using Microsoft.Data.SqlClient;
// 接続文字列
var connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=testdb;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False";
Update();
Insert();
Delete();
Console.WriteLine("処理が完了しました!");
// Update文を実行するメソッド
void Update()
{
// IDが2のレコードのAgeを50に更新する
var updateQuery = "UPDATE Test SET Age = 50 WHERE Id = 2";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(updateQuery, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}
// Insert文を実行するメソッド
void Insert()
{
// パラメーターで中身を指定したレコードを追加
var insertQuery = @"INSERT INTO Test(Id, Name, Age, Birthday) VALUES (@id, @name, @age, @birthday)";
var name = "Nancy";
var age = "28";
var birthday = "1993/5/5";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(insertQuery, connection))
{
connection.Open();
// パラメーターの追加
command.Parameters.AddWithValue("@id", 4);
command.Parameters.AddWithValue("@name", name);
command.Parameters.AddWithValue("@age", age);
command.Parameters.AddWithValue("@birthday", birthday);
command.ExecuteNonQuery();
}
}
// Delete文を実行するメソッド
void Delete()
{
// Idが3のレコードを削除
var deleteQuery = "DELETE FROM Test WHERE Id = 3";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(deleteQuery, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}
プログラムの解説
各メソッドの内容について解説します。
Update
void Update()
{
// IDが2のレコードのAgeを50に更新する
var updateQuery = "UPDATE Test SET Age = 50 WHERE Id = 2";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(updateQuery, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}
Update文を実行するメソッドです。
SqlCommand
クラスの第1引数に実行するクエリを渡し、ExecuteNonQuery
メソッドを呼び出すことでSQLが実行されます。
ExecuteNonQuery
メソッドはUpdate・Insert・Deleteなど更新系の処理に使用します。
戻り値として、SQL実行により影響を受けた行の数が返されます。
Updateメソッドを実行すると、Idが2のレコードのAgeが更新されました。
※左上の更新矢印ボタンを押すと画面が更新されます。
Insert
void Insert()
{
// パラメーターで中身を指定したレコードを追加
var insertQuery = @"INSERT INTO Test(Id, Name, Age, Birthday)
VALUES (@id, @name, @age, @birthday)";
var name = "Nancy";
var age = "28";
var birthday = "1993/5/5";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(insertQuery, connection))
{
connection.Open();
// パラメーターの追加
command.Parameters.AddWithValue("@id", 4);
command.Parameters.AddWithValue("@name", name);
command.Parameters.AddWithValue("@age", age);
command.Parameters.AddWithValue("@birthday", birthday);
command.ExecuteNonQuery();
}
}
Updateと基本的な構文は同じですが、SQL文の中に「@~」が含まれています。
これはパラメータクエリと呼ばれるもので、SQLインジェクション対策に用いられます。
command.Parameters.AddWithValue("@パラメータ名", 代入したい値)
と書くことでパラメータに値が代入されます。
今回はIdを直接指定し、それ以外は変数で指定しています。
Insertメソッドを実行してみると、Idが4となるレコードが追加されます。
各データもパラメーターの内容と一致していることがわかります。
Delete
void Delete()
{
// Idが3のレコードを削除
var deleteQuery = "DELETE FROM Test WHERE Id = 3";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(deleteQuery, connection))
{
connection.Open();
command.ExecuteNonQuery();
}
}
これはシンプルですね。SQL文の中身以外はUpdateやInsertと同じ構文です。
実行してみると、Idが3のレコードが削除されました。
※一度実行するとデータが更新されてしまうため、再度実行する場合は各メソッドの内容を書き換えてから実行してください。
参考:非同期処理による書き方
実際の開発でデータの更新や読み取り処理を書く際は、同期処理ではなく非同期処理(処理の完了を待たずに他の処理を実行する仕組み)を用いることが一般的です。
参考までに先ほどのプログラムの非同期処理版も掲載しておきます。基本的にAsyncが付くメソッドに置き換えるだけです。
using Microsoft.Data.SqlClient;
// 接続文字列
var connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=testdb;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False";
await UpdateAsync();
await InsertAsync();
await DeleteAsync();
Console.WriteLine("処理が完了しました!");
// Update文を実行する非同期メソッド
async Task UpdateAsync()
{
// IDが2のレコードのAgeを50に更新する
var updateQuery = "UPDATE Test SET Age = 50 WHERE Id = 2";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(updateQuery, connection))
{
await connection.OpenAsync();
await command.ExecuteNonQueryAsync();
}
}
// Insert文を実行する非同期メソッド
async Task InsertAsync()
{
// パラメーターで中身を指定したレコードを追加
var insertQuery = @"INSERT INTO Test(Id, Name, Age, Birthday) VALUES (@id, @name, @age, @birthday)";
var name = "Nancy";
var age = "28";
var birthday = "1993/5/5";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(insertQuery, connection))
{
await connection.OpenAsync();
// パラメーターの追加
command.Parameters.AddWithValue("@id", 4);
command.Parameters.AddWithValue("@name", name);
command.Parameters.AddWithValue("@age", age);
command.Parameters.AddWithValue("@birthday", birthday);
await command.ExecuteNonQueryAsync();
}
}
// Delete文を実行する非同期メソッド
async Task DeleteAsync()
{
// Idが3のレコードを削除
var deleteQuery = "DELETE FROM Test WHERE Id = 3";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(deleteQuery, connection))
{
await connection.OpenAsync();
await command.ExecuteNonQueryAsync();
}
}
参考記事
コンソールアプリではなく、ASP.NET Core MVCアプリ上でSqlClientを用いたDB操作を行う方法については以下の記事を参照してください。
Entity Framework Coreを使ったSQL Serverのデータ操作方法を知りたい場合は以下の記事を参照してください。