「C Sharpとデータベース - CRUDの実行」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「 == 概要 == C\#でSQL Serverに対して変更処理(INSERT, UPDATE, DELETE)を実行する方法をまとめる。<br><br> == 1行のみ実行 == 単一テーブル…」)
 
編集の要約なし
1行目: 1行目:


== 概要 ==
== 概要 ==
C\#でSQL Serverに対して変更処理(INSERT, UPDATE, DELETE)を実行する方法をまとめる。<br><br>
C#でSQL Serverに対して変更処理(INSERT, UPDATE, DELETE)を実行する方法をまとめる。<br><br>


== 1行のみ実行 ==
== 1行のみ実行 ==
単一テーブルにしか影響しないようなSQLは1行だけ実行することになる。
単一テーブルにしか影響しないようなSQLは1行だけ実行することになる。<br>
このようなクエリを実行する場合、トランザクションを考慮せずそのままExecuteNonQuery()メソッドを実行する方法が簡単である。
このようなクエリを実行する場合、トランザクションを考慮せずそのままExecuteNonQuery()メソッドを実行する方法が簡単である。<br>


  <small>using System;
  using System;
  using System.Configuration;
  using System.Configuration;
  using System.Data.SqlClient;
  using System.Data.SqlClient;
44行目: 44行目:
         }
         }
     }
     }
  }</small>
  }
<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;