「C Sharpとデータベース - CRUDの実行」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「 == 概要 == C\#でSQL Serverに対して変更処理(INSERT, UPDATE, DELETE)を実行する方法をまとめる。<br><br> == 1行のみ実行 == 単一テーブル…」) |
編集の要約なし |
||
1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
C | C#でSQL Serverに対して変更処理(INSERT, UPDATE, DELETE)を実行する方法をまとめる。<br><br> | ||
== 1行のみ実行 == | == 1行のみ実行 == | ||
単一テーブルにしか影響しないようなSQLは1行だけ実行することになる。 | 単一テーブルにしか影響しないようなSQLは1行だけ実行することになる。<br> | ||
このようなクエリを実行する場合、トランザクションを考慮せずそのままExecuteNonQuery()メソッドを実行する方法が簡単である。 | このようなクエリを実行する場合、トランザクションを考慮せずそのままExecuteNonQuery()メソッドを実行する方法が簡単である。<br> | ||
using System; | |||
using System.Configuration; | using System.Configuration; | ||
using System.Data.SqlClient; | using System.Data.SqlClient; | ||
44行目: | 44行目: | ||
} | } | ||
} | } | ||
}</ | } | ||
<br> | |||
== トランザクション処理 == | |||
複数のテーブルにINSERT / UPDATE / DELETEを行う場合、トランザクションを利用する場合が多い。<br> | |||
using System; | |||
using System.Configuration; | |||
using System.Data.SqlClient; | |||
public void Insert2(string id, string password, string phone, string address) | |||
{ | |||
// 接続文字列の取得 | |||
var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; | |||
using (var connection = new SqlConnection(connectionString)) | |||
{ | |||
try | |||
{ | |||
// データベースの接続開始 | |||
connection.Open(); | |||
using (var transaction = connection.BeginTransaction()) | |||
using (var command = new SqlCommand() { Connection = connection, Transaction = transaction }) | |||
{ | |||
try | |||
{ | |||
// 親テーブルを挿入するSQLの準備 | |||
command.CommandText = @"INSERT INTO T_USER (ID, PASSWORD) VALUES (@ID, @PASSWORD)"; | |||
command.Parameters.Add(new SqlParameter("@ID", id)); | |||
command.Parameters.Add(new SqlParameter("@PASSWORD", password)); | |||
// 親テーブルを挿入するSQLの実行 | |||
command.ExecuteNonQuery(); | |||
// 子テーブルを挿入するSQLの準備 | |||
command.CommandText = @"INSERT INTO T_USER_EXT (ID, PHONE, ADDRESS) VALUES (@ID, @PHONE, @ADDRESS)"; | |||
////command.Parameters.Add(new SqlParameter("@ID", id)); // <- 上で既に @ID を追加済みのため再投入は不要。 | |||
command.Parameters.Add(new SqlParameter("@PHONE", phone)); | |||
command.Parameters.Add(new SqlParameter("@ADDRESS", address)); | |||
// 子テーブルを挿入するSQLの実行 | |||
command.ExecuteNonQuery(); | |||
// コミット | |||
transaction.Commit(); | |||
} | |||
catch | |||
{ | |||
// ロールバック | |||
transaction.Rollback(); | |||
throw; | |||
} | |||
} | |||
} | |||
catch (Exception exception) | |||
{ | |||
Console.WriteLine(exception.Message); | |||
throw; | |||
} | |||
finally | |||
{ | |||
// データベースの接続終了 | |||
connection.Close(); | |||
} | |||
} | |||
} | |||
<br><br> | |||
== その他のクエリ == | |||
'''INSERT''' | |||
INSERT INTO T_USER(ID, PASSWORD) VALUES(@ID, @PASSWORD); | |||
'''UPDATE''' | |||
UPDATE T_USER SET PASSWORD=@PASSWORD WHERE ID=@ID; | |||
'''DELETE''' | |||
DELETE FROM T_USER WHERE ID=@ID; | |||
<br><br> | |||
[[カテゴリ:C_Sharp]] |
2019年6月29日 (土) 17:52時点における版
概要
C#でSQL Serverに対して変更処理(INSERT, UPDATE, DELETE)を実行する方法をまとめる。
1行のみ実行
単一テーブルにしか影響しないようなSQLは1行だけ実行することになる。
このようなクエリを実行する場合、トランザクションを考慮せずそのままExecuteNonQuery()メソッドを実行する方法が簡単である。
using System; using System.Configuration; using System.Data.SqlClient; public void Insert1(string id, string password, string role) { // 接続文字列の取得 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; using (var connection = new SqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // SQLの準備 command.CommandText = @"INSERT INTO T_USER (ID, PASSWORD, ROLE_NAME) VALUES (@ID, @PASSWORD, @ROLE_NAME)"; command.Parameters.Add(new SqlParameter("@ID", id)); command.Parameters.Add(new SqlParameter("@PASSWORD", password)); command.Parameters.Add(new SqlParameter("@ROLE_NAME", role)); // SQLの実行 command.ExecuteNonQuery(); } catch (Exception exception) { Console.WriteLine(exception.Message); throw; } finally { // データベースの接続終了 connection.Close(); } } }
トランザクション処理
複数のテーブルにINSERT / UPDATE / DELETEを行う場合、トランザクションを利用する場合が多い。
using System; using System.Configuration; using System.Data.SqlClient; public void Insert2(string id, string password, string phone, string address) { // 接続文字列の取得 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; using (var connection = new SqlConnection(connectionString)) { try { // データベースの接続開始 connection.Open(); using (var transaction = connection.BeginTransaction()) using (var command = new SqlCommand() { Connection = connection, Transaction = transaction }) { try { // 親テーブルを挿入するSQLの準備 command.CommandText = @"INSERT INTO T_USER (ID, PASSWORD) VALUES (@ID, @PASSWORD)"; command.Parameters.Add(new SqlParameter("@ID", id)); command.Parameters.Add(new SqlParameter("@PASSWORD", password)); // 親テーブルを挿入するSQLの実行 command.ExecuteNonQuery(); // 子テーブルを挿入するSQLの準備 command.CommandText = @"INSERT INTO T_USER_EXT (ID, PHONE, ADDRESS) VALUES (@ID, @PHONE, @ADDRESS)"; ////command.Parameters.Add(new SqlParameter("@ID", id)); // <- 上で既に @ID を追加済みのため再投入は不要。 command.Parameters.Add(new SqlParameter("@PHONE", phone)); command.Parameters.Add(new SqlParameter("@ADDRESS", address)); // 子テーブルを挿入するSQLの実行 command.ExecuteNonQuery(); // コミット transaction.Commit(); } catch { // ロールバック transaction.Rollback(); throw; } } } catch (Exception exception) { Console.WriteLine(exception.Message); throw; } finally { // データベースの接続終了 connection.Close(); } } }
その他のクエリ
INSERT
INSERT INTO T_USER(ID, PASSWORD) VALUES(@ID, @PASSWORD);
UPDATE
UPDATE T_USER SET PASSWORD=@PASSWORD WHERE ID=@ID;
DELETE
DELETE FROM T_USER WHERE ID=@ID;