【C#】C#から引数を渡してSQL Serverのストアドプロシージャを呼び出すには

この記事では、C#から引数を渡してSQL Serverのストアドプロシージャを呼び出す方法についてご説明します。

【動画】C#から引数を渡してSQL Serverのストアドプロシージャを呼び出す実際の動き

本題に入る前に、まずは次の動画をご覧ください。


SqlConnectionインスタンスを生成し、SQL Serverのデータベースに接続するのに必要な接続文字列を参照してSQL Serverのデータベースに接続します。

SQL Serverのデータベースに接続したら、実行したいストアドプロシージャ名を指定してSqlCommandインスタンスを生成します。

SqlCommandインスタンスが生成されたら、ストアドプロシージャに渡したい引数を指定してストアドプロシージャを実行します。

コードの流れ

STEP.1
SQL Serverのデータベースに接続するのに必要な接続文字列を用意する
SQL Serverのデータベースに接続するのに必要な接続文字列を用意します。
STEP.2
STEP.1で用意した接続文字列を元に、SqlConnectionオブジェクトを作成する
STEP.1で用意した接続文字列を元にOleDbConnectionオブジェクトを作成します。
STEP.3
SqlConnectionオブジェクトのOpenメソッドを実行してSQL Serverのデータベースに接続する
SqlConnectionオブジェクトのOpenメソッドを実行してSQL Serverのデータベースに接続します。
STEP.4
SqlCommandインスタンスを生成する際に実行したいストアドプロシージャ名を指定して生成する
SqlCommandインスタンスを生成する際に実行したいストアドプロシージャ名を指定して生成します。
STEP.5
実行するストアドプロシージャに渡したい引数を指定する
実行するストアドプロシージャに渡したい引数を指定します。
STEP.6
SqlCommandインスタンスのExecuteNonQueryを実行してストアドプロシージャを実行する
SqlCommandインスタンスのExecuteNonQueryを実行してストアドプロシージャを実行します。

ストアドプロシージャとSQL Serverのテーブルデータの例

今回は次のストアドプロシージャを用意しました。

今回用意したストアドプロシージャは、3つの引数を受け取ってUPDATE文を実行します。

引数は、更新するテーブル名、更新する値、どのデータを更新するかを特定する条件値、の3つです。

また、今回更新するテーブルとそのテーブルデータは下のとおりです。

今回はこの「tbl_test」のinfoNoが1のデータのscoreの値を58から100に更新したいと思います。

実行前と実行後は下のとおりです。

C#のコード(例)

App.configのコード

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <appSettings>
        <!-- 接続文字列 -->
        <add key="DBConnString" value="Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog={0};Integrated Security=True" />

        <!-- SQL Serverのデータベース名 -->
        <add key="DBName" value="CS_01" />

    </appSettings>
</configuration>

注目すべきコード

見て頂きたいのは8行目から11行目です。

8行目は、SQL Serverのデータベースに接続するのに必要な接続文字列を「DBConnString」というキーに設定しているコードです。

11行目は、SQL Serverのデータベース名を「DBName」というキーに設定しているコードです。

「DBConnString」と「DBName」のキーの値をフォーム側のコードが参照して使います。

ちなみに、今回接続しようとしているデータベース「CS_01」は下の画像にあるデータベースです。

フォームのコード

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace wfcs_0009
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // App.configのappSettingsタグ内に記述した「DBConnString」のキーの値を取得して変数「connStrTemplate」に格納する
            string connStrTemplate = ConfigurationManager.AppSettings["DBConnString"];

            // App.configのappSettingsタグ内に記述した「DBName」のキーの値を取得して変数「DBName」に格納する
            string DBName = ConfigurationManager.AppSettings["DBName"];

            // connStrTemplateの{0}の部分を、「DBName」の値に置き換える
            string connectionString = string.Format(connStrTemplate, DBName);

            // SqlConnectionインスタンスを生成
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                // SQL Serverのデータベース「CS_01」に接続する
                connection.Open();

                // 「testProc」を実行するためのSqlCommandインスタンスを生成する
                using (SqlCommand command = new SqlCommand("procTest", connection))
                {

                    // 実行するコマンドのタイプ(今回はストアドプロシージャ)を取得し、ストアドプロシージャを実行すると認識させる
                    command.CommandType = CommandType.StoredProcedure;

                    // 引数を追加する(1つ目)
                    command.Parameters.AddWithValue("@tblNM", "tbl_test"); 

                    // 引数を追加する(2つ目)
                    command.Parameters.AddWithValue("@updVal", "100"); 

                    // 引数を追加する(3つ目)
                    command.Parameters.AddWithValue("@whereVal", "1"); 

                    // ストアドプロシージャを実行する
                    command.ExecuteNonQuery();

                }
            }
        }
    }
}

注目すべきコード①

最初に見て頂きたいのは4行目です。

using System.Data.SqlClient;

コードの説明

以上のコードは、「System.Data.SqlClient」はSqlConnectionクラスを使うのに必要な名前空間です。

SqlConnectionクラスからインスタンスを生成し、SqlConnectionインスタンスのOpenメソッドを実行することでSQL Serverのデータベースに接続することができます。

注目すべきコード②

次に見て頂きたいのは18行目から22行目です。

            // App.configのappSettingsタグ内に記述した「DBConnString」のキーの値を取得して変数「connStrTemplate」に格納する
            string connStrTemplate = ConfigurationManager.AppSettings["DBConnString"];

            // App.configのappSettingsタグ内に記述した「DBName」のキーの値を取得して変数「DBName」に格納する
            string DBName = ConfigurationManager.AppSettings["DBName"];

コードの説明

以上のコードは、App.configのappSettingsタグ内に記述した「DBConnString」「DBName」のキーの値を取得して変数に格納するコードです。

「DBConnString」のキーの値は変数「connStrTemplate」に、「DBName」のキーの値は変数「DBName」に格納します。

注目すべきコード③

次に見て頂きたいのは26行目です。

            // connStrTemplateの{0}の部分を、「DBName」の値に置き換える
            string connectionString = string.Format(connStrTemplate, DBName);

コードの説明

以上のコードは、connStrTemplateの{0}の部分を、「DBName」の値に置き換える処理のコードです。

connStrTemplateの{0}の部分を、「DBName」の値に置き換える、とはどういうことかというと、{0}の部分をSQL Serverのデータベース名に置き換える、ということです。

今回は接続文字列と、SQL Serverのデータベース名を分けてそれぞれ「DBConnString」と「DBName」とキーを分けてあるので、フォームのコード側で接続文字列と、SQL Serverのデータベース名を一つの文字列に組み立てています。

参考までに、string.Format実行前と実行後の状態を以下にお見せします。

以上のように、{0}の部分が「CS_01」に置き換わっています。

参考:string.Format実行前

“Data Source=(LocalDB)\\MSSQLLocalDB;Initial Catalog={0};Integrated Security=True”

参考:string.Format実行後

“Data Source=(LocalDB)\\MSSQLLocalDB;Initial Catalog=CS_01;Integrated Security=True”

注目すべきコード④

次に見て頂きたいのは29行目から32行目です。

            // SqlConnectionインスタンスを生成
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                // SQL Serverのデータベース「CS_01」に接続する
                connection.Open();

コードの説明

以上のコードは、SqlConnectionインスタンスを作成し、SQL Serverのデータベースに接続している処理のコードです。

コードの詳細

29行目のコードでは、App.configから取得したSQL Serverのデータベースの接続情報(connectionString)を元にSqlConnectionインスタンスを作成しています。

32行目のコードでは、生成したSqlConnectionインスタンスのOpenメソッドを実行してSQL Serverのデータベースに接続しています。

注目すべきコード⑤

次に見て頂きたいのは35行目から53行目です。

                // 「testProc」を実行するためのSqlCommandインスタンスを生成する
                using (SqlCommand command = new SqlCommand("testProc", connection))
                {

                    // 実行するコマンドのタイプ(今回はストアドプロシージャ)を取得し、ストアドプロシージャを実行すると認識させる
                    command.CommandType = CommandType.StoredProcedure;

                    // 引数を追加する(1つ目)
                    command.Parameters.AddWithValue("@tblNM", "tbl_test"); 

                    // 引数を追加する(2つ目)
                    command.Parameters.AddWithValue("@updVal", "100"); 

                    // 引数を追加する(3つ目)
                    command.Parameters.AddWithValue("@whereVal", "1"); 

                    // ストアドプロシージャを実行する
                    command.ExecuteNonQuery();

                }

コードの説明

以上のコードは、ストアドプロシージャ「testProc」を実行するためのSqlCommandインスタンスを生成し、そのストアドプロシージャに引数を指定して実行する処理のコードです。

コードの詳細

35行目のコードでは、ストアドプロシージャ「testProc」を実行するためのSqlCommandインスタンスを生成します。

39行目のコードでは、実行するコマンドのタイプを取得します。

今回はストアドプロシージャを実行したいので、CommandType.StoredProcedureを指定します。

CommandType.StoredProcedureを指定することで、ストアドプロシージャを呼び出すことができるようになります。

42行目から48行目のコードは、ストアドプロシージャに引数を指定するコードです。

今回は3つの値をストアドプロシージャ側に渡したいので、42行目と45行目、48行目でストアドプロシージャ側に渡す引数を指定しています。

C#側で指定された引数とストアドプロシージャ側が受け取る引数のイメージは下のとおりです。

51行目のコードで、ストアドプロシージャを実行します。

動作確認

「ストアドプロシージャとSQL Serverのテーブルデータの例」をご覧ください。

【注意】参照設定が必要です

一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。

「System.Configuration」の項目を追加しないと、「ConfigurationManager」が存在しないとのことでエラーになってしまいます。

本コードを実行する際は、「System.Configuration」の項目を追加しましょう。

最後に

この記事では、C#から引数を渡してSQL Serverのストアドプロシージャを呼び出す方法についてご説明しました。

C#から引数を渡してSQL Serverのストアドプロシージャを呼び出したいときは本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら