花鬼の庵

開発とかゲームとか実況とか

【C#】で行うDB接続とクエリ文の実行、値の保存と更新、削除

hanaonieruni.hatenablog.com

↑の続き

前はC#でDBへ接続して値を取得(SELECT)した。
新規保存や更新、削除(INSERTやUPDATE、DELETE)もそのままで行けるけど、
ExecuteReader()よりも
ExecuteNonQuery()を使った方が良いらしい。
とりあえず以下の関数を前回の記事に載せた" class DBconnect "に追加する。

static public int ExecuteNonQuery(SqlConnection connection, String sql, Dictionary<String, String> param = null)
        {
            int rtn = -1;
            try
            {
                // データベースの接続開始
                connection.Open();
                Console.WriteLine(connection.State.ToString());
                using (SqlCommand command = new SqlCommand() { CommandText = sql, Connection = connection })
                {
                    try
                    {
                        if (param != null)
                        {
                            foreach (string Key in param.Keys)
                            {
                                command.Parameters.AddWithValue(Key, param[Key]);
                            }
                        }
                        // SQLの実行
                        rtn = command.ExecuteNonQuery();
                    }
                    catch
                    {
                        throw;
                    }
                }
            }
            catch
            {
            }
            return rtn;
        }

簡単に解説

解説といっても
// SQLの実行
reader = command.ExecuteReader();
これを
command.ExecuteNonQuery();
に変えただけ。

ExecuteNonQuery()は影響を受けた行数を返してくれる。
INSERTで1行追加したなら”1”
UPDATEで5行のとある値を更新したなら”5”
条件(WHERE)を間違えてなにも変更が起きなかったらもちろん”0”が返される。

実装例

あとの使い方は大体同じ。
新規保存(INSERT)する場合はの場合は

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;

namespace CheckSQL
{
    class Program
    {
        static void Main(string[] args)
        {
            // DB接続
            string connectionString = DBconnect.GetConnectionString();
            StringBuilder sql = new StringBuilder();

            // クエリ文実行
            sql.AppendLine("INSERT INTO C_スケジュール");
            sql.AppendLine(" ( 日付 , ID ) ");
            sql.AppendLine("VALUES");
            sql.AppendLine("('2022/03/28', 1 ) ");

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                if(RdoConnect.ExecuteNonQuery(connection, sql.ToString()) >= 0)
                {
                    // 成功
                }else
                {
                    // 失敗
                }
            }
        }
    }
}

更新と削除(UPDATEとDELETE)もクエリ文だけ変えればいい。

締め

以上、前の記事と処理自体はほとんど同じなんだけど、そのせいでいぞ使うときパッと出てこないもので、記事に残しておこうと思った次第。

なにか質問等々ございましたらコメントいただければと思います。