SQL ServerのストアドプロシージャからOUTPUTと戻り値を受け取る方法です。
ちなみに今回もSQL Serverにあらかじめ以下のようなテーブルを作成しています。
テーブル名:T_Animals
列名
[ID] [int] NOT NULL
[Name] [nvarchar](50) NULL
[Type] [nvarchar](50) NULL
格納されてるデータ
ID | Name | Type |
---|---|---|
1 | たま | 猫 |
2 | ピーター | うさぎ |
3 | トム | 猫 |
4 | お父さん | 犬 |
5 | ふてニャン | 猫 |
6 | プー | くま |
7 | ファーファ | くま |
8 | ラスカル | アライグマ |
9 | サトちゃん | 象 |
10 | チーバくん | 犬 |
11 | パトラッシュ | 犬 |
また、usp_get_outputという名前のストアドプロシージャをあらかじめ作っておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | USE [TESTDB] GO CREATE PROCEDURE [dbo].[usp_get_output] @ID int , @ Name nvarchar(50) OUTPUT AS BEGIN SET NOCOUNT ON ; SET @ Name = ( SELECT [ Name ] FROM [dbo].[T_Animals] WHERE [ID] = @ID) RETURN 0 END |
パラメータにOUTPUTがついてるものがありますが、これがアウトプット引数で、このパラメータによりデータを受け取ることができます。
また、終わりにRETURN 0とありますが、ここで指定してる「0」が戻り値になります。
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | string ConnectionString = string .Empty; ConnectionString = @"Data Source=localhost\MSSQLSERVER;Initial Catalog=TESTDB;Integrated Security=True" ; var cnn = new SqlConnection(ConnectionString); cnn.Open(); var cmd = new SqlCommand(); cmd.Connection = cnn; // コマンド文字列の解釈方法を指定 cmd.CommandType = System.Data.CommandType.StoredProcedure; // INPUT int inputId = 5; // データソースで実行するストアドプロシージャを指定 cmd.CommandText = "[usp_get_output]" ; cmd.Parameters.Clear(); cmd.Parameters.Add( "@ID" , System.Data.SqlDbType.Int).Value = inputId; // OUTPUT cmd.Parameters.Add( "@Name" , System.Data.SqlDbType.NVarChar, 50); cmd.Parameters[ "@Name" ].Direction = System.Data.ParameterDirection.Output; // RETURN cmd.Parameters.Add( "ReturnValue" , System.Data.SqlDbType.Int); cmd.Parameters[ "ReturnValue" ].Direction = System.Data.ParameterDirection.ReturnValue; cmd.ExecuteNonQuery(); Console.WriteLine( "インプット:" + inputId.ToString()); string name = cmd.Parameters[ "@Name" ].Value.ToString(); Console.WriteLine( "アウトプット:" + name); int rtn = ( int )cmd.Parameters[ "ReturnValue" ].Value; Console.WriteLine( "戻り値:" + rtn.ToString()); cmd.Dispose(); cnn.Close(); |
VB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | Dim ConnectionString As String = String .Empty ConnectionString = "Data Source=localhost\MSSQLSERVER;Initial Catalog=TESTDB;Integrated Security=True" Dim cnn = New SqlConnection(ConnectionString) cnn.Open() Dim cmd = New SqlCommand() cmd.Connection = cnn cmd.CommandType = System.Data.CommandType.StoredProcedure 'INPUT Dim inputId As Integer = 5 'データソースで実行するストアドプロシージャを指定 cmd.CommandText = "[usp_get_output]" cmd.Parameters.Clear() cmd.Parameters.Add( "@ID" , System.Data.SqlDbType.Int).Value = inputId 'OUTPUT cmd.Parameters.Add( "@Name" , System.Data.SqlDbType.NVarChar, 50) cmd.Parameters( "@Name" ).Direction = System.Data.ParameterDirection.Output 'RETURN cmd.Parameters.Add( "ReturnValue" , System.Data.SqlDbType.Int) cmd.Parameters( "ReturnValue" ).Direction = System.Data.ParameterDirection.ReturnValue cmd.ExecuteNonQuery() Console.WriteLine( "インプット:" & inputId.ToString()) Dim name As String = cmd.Parameters( "@Name" ).Value.ToString() Console.WriteLine( "アウトプット:" & name) Dim rtn As Integer = DirectCast (cmd.Parameters( "ReturnValue" ).Value, Integer ) Console.WriteLine( "戻り値:" + rtn.ToString()) cmd.Dispose() cnn.Close() |
結果は下記のようになります。
1 2 3 | インプット:5 アウトプット:ふてニャン 戻り値:0 |
スポンサーリンク