VB.NETでのストアドプロシージャの戻り値取得について。

タグの編集
投稿者 まる  (社会人) 投稿日時 2009/2/5 20:40:00
すみません。また投稿させていただきました。

今VB.NET(ver.2005)でADO.NETをやっています。
全然やったことがなかったのでほとんどわかりません・・・。

今自分が悩んでいるところは「ストアドプロシージャからの戻り値の取得」です。
一応プログラムを作成してみたのはいいものの、ストアドプロシージャの結果とVBの渡された値に違いがあって意味がわかりません・・・。

わかる方がいましたら、ご教授お願いいたします。

今の状態ですと、レコード数が「32」あるのに、VB.NETだと「6」と表示されます・・・。

ストアドプロシージャ
----------------------------------------------
ALTER PROCEDURE dbo.SpMsTokuisakiCount
/*
(
@count int output
)
*/
AS
SET NOCOUNT ON

declare @count int

select count (*) from MSTokuisaki
 
RETURN @count
---------------------------------------------

VB.NET
---------------------------------------------
    Public Function test() As Decimal

        Dim cn As SqlClient.SqlConnection

        Dim max As New SqlClient.SqlParameter

        'SQLに対してコマンドを入れるための変数
        Dim command As New SqlClient.SqlCommand

        'コネクションの指定
        command.Connection = cn

        'コマンドの種類をストアドプロシージャに
        command.CommandType = CommandType.StoredProcedure

        '実行するストアドプロシージャの名前を指定
        command.CommandText = "SpMsTokuisakiCount"

        command.Parameters.Clear()

        command.Parameters.Add("RETURN_VALUE", SqlDbType.Decimal)

        max.Direction = ParameterDirection.ReturnValue

        Return max.Direction

    End Function
---------------------------------------------
投稿者 まる  (社会人) 投稿日時 2009/2/6 01:48:32
select count (*) from MSTokuisaki
はミスです・・・。

select @count = count (*) from MSTokuisaki
の間違いでした。
投稿者 nakaP  (社会人) 投稿日時 2009/2/6 02:49:53
はじめまして。

別途SqlParameterオブジェクトを用意し、DirectionプロパティをOutputに指定してやってみてはどうでしょうか。
投稿者 まる  (社会人) 投稿日時 2009/2/7 01:37:07
nakaPさん、はじめまして。回答ありがとうございます。

outputにしても結果は同じでした。
試行錯誤を繰り返していたらできてしまいました・・・。

質問をしたのにすみませんでした・・・。

こうなりました・・・。

        '戻り値を受け取るために実行する("Return"の文字は何でもいい)
        command.Parameters.Add("Return", SqlDbType.Decimal)

        '戻り値の値を入れる
        command.Parameters("Return").Direction = ParameterDirection.ReturnValue

        'Connectionオブジェクトでコマンドを実行して、影響を受けた行の数を返す
        command.ExecuteNonQuery()

        '型変換して代入
        max = CType(command.Parameters("Return").Value, Decimal)
投稿者 nakaP  (社会人) 投稿日時 2009/2/7 02:56:54
すいません、最初のストアドのパラメタはコメントアウトされてたんですね。見落としてました。

で、少し気になったんですが、
>declare @count int
となっているのに
>command.Parameters.Add("Return", SqlDbType.Decimal)
としているのは、型が違うとなるんじゃないでしょうか。

あとはSqlParameterクラスのプロパティを調査してみるとか。
投稿者 まる  (社会人) 投稿日時 2009/2/16 18:31:59
nakaPさん、お返事ありがとうございます。遅れてすみませんでした。

変数が違うのは自分のミスなのですぐ修正しました。
プロパティで参照ですね、試してみます。nakaPさん、本当にありがとうございました。