戻り値を使用してストアドプロシージャを呼び出す


82

C#Windowsアプリケーションからストアドプロシージャを呼び出そうとしています。ストアドプロシージャはSQLServer 2008のローカルインスタンスで実行されています。ストアドプロシージャを呼び出すことはできますが、ストアドプロシージャから値を取得することはできません。このストアドプロシージャは、シーケンス内の次の番号を返すことになっています。私はオンラインで調査を行い、私が見たすべてのサイトはこのソリューションが機能していることを示しています。

ストアドプロシージャコード:

ALTER procedure [dbo].[usp_GetNewSeqVal]
      @SeqName nvarchar(255)
as
begin
      declare @NewSeqVal int
      set NOCOUNT ON
      update AllSequences
      set @NewSeqVal = CurrVal = CurrVal+Incr
      where SeqName = @SeqName

      if @@rowcount = 0 begin
print 'Sequence does not exist'
            return
      end

      return @NewSeqVal
end

ストアドプロシージャを呼び出すコード:

SqlConnection conn = new SqlConnection(getConnectionString());
conn.Open();

SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter param = new SqlParameter();

param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar);
param.Direction = ParameterDirection.Input;
param.Value = "SeqName";

SqlDataReader reader = cmd.ExecuteReader();

また、DataSetを使用して同じ結果の戻り値を取得しようとしました。ストアドプロシージャから戻り値を取得するために何が欠けていますか?さらに詳しい情報が必要な場合は、お知らせください。

回答:


165

コマンドにreturnパラメーターを追加する必要があります。

using (SqlConnection conn = new SqlConnection(getConnectionString()))
using (SqlCommand cmd = conn.CreateCommand())
{
    cmd.CommandText = parameterStatement.getQuery();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("SeqName", "SeqNameValue");

    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;

    conn.Open();
    cmd.ExecuteNonQuery();
    var result = returnParameter.Value;
}

3
@ReturnValストアドプロシージャにも追加する必要がありますか?
muttley91 2014

4
いいえ、spに追加する必要はありません(returnステートメントはReturnValueでマークされたパラメーターの入力をトリガーします)
ufosnowcat 2014

10
ところで、returnvalパラメーターの名前は関係ありません。
クレイ

どうもありがとう、私は適切に戻り値を取得する方法を探していました、これは本当に私のために働きました。驚くばかり!
Oswaldo Zapata 2017

4
ストアドプロシージャの戻り値は、成功(ゼロ)または失敗/警告(ゼロ以外)を示すためにのみ使用する必要があり、データを返すことはできません。OUTPUTその目的のためにパラメータまたは結果セットを使用します。
Dan Guzman

5

私はこれが古いことを知っています、しかし私はグーグルでそれにつまずきました。

ストアドプロシージャに戻り値がある場合は、「Return1」と言います。出力パラメータは使用しません。

次の操作を実行できます-「@ RETURN_VALUE」はすべてのコマンドオブジェクトにサイレントに追加されます。明示的に追加する必要はありません

    cmd.ExecuteNonQuery();
    rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;

2
こんにちはゲイリー。たまたま引用がありますか?
マイケル

5
明示的に追加されない限り、cmdインスタンスにSqlParameterCollectionのRETURN_VALUEという名前のパラメーターがあるとは思いません。したがって、Garyによる上記のアプローチの採用を検討している場合は、cmd.Parameters.Add(new SqlParameter( "@ RETURN_VALUE"、SqlDbType.Int));を追加したことを確認してください。cmd.Parameters ["@ RETURN_VALUE"]。Direction = ParameterDirection.ReturnValue; ただし、ストアドプロシージャの定義に@RETURN_VALUEを追加する必要はないと思います。おそらくそれがゲイリーの意味です。
jbooker 2016

4

私のマシンのEnterpriseLibraryのバージョンには他のパラメーターがありました。これは機能していました:

        SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int);
        retval.Direction = System.Data.ParameterDirection.ReturnValue;
        cmd.Parameters.Add(retval);
        db.ExecuteNonQuery(cmd);
        object o = cmd.Parameters["@ReturnValue"].Value;



2

SP呼び出しで同様の問題が発生し、予期されたパラメーターが含まれていないというエラーが返されました。私のコードは次のとおりです。
ストアドプロシージャ:

@Result int OUTPUT

そしてC#:

            SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32));
            result.Direction = ParameterDirection.ReturnValue;

トラブルシューティングで、ストアドプロシージャが実際に「入出力」の方向を探していることに気付いたので、次の変更で問題が修正されました。

            r

Result.Direction = ParameterDirection.InputOutput;


1
「出力パラメータ」は、ストアドプロシージャの戻り値と同じではありません。
ダイ

0

または、標準のADO.NETではなくEnterpriseLibraryを使用している場合...

Database db = DatabaseFactory.CreateDatabase();
using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal"))
{
    db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue");
    db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null);

    db.ExecuteNonQuery(cmd);

    var result = (int)cmd.Parameters["RetVal"].Value;
}

0

これは、プロシージャから単一の値を返す非常に短いサンプルです。

SQL:

CREATE PROCEDURE [dbo].[MakeDouble] @InpVal int AS BEGIN 
SELECT @InpVal * 2; RETURN 0; 
END

C#コード:

int inpVal = 11;
string retVal = "?";
using (var sqlCon = new SqlConnection(
    "Data Source = . ; Initial Catalog = SampleDb; Integrated Security = True;"))
{
    sqlCon.Open();
    retVal = new SqlCommand("Exec dbo.MakeDouble " + inpVal + ";", 
        sqlCon).ExecuteScalar().ToString();
    sqlCon.Close();
}
Debug.Print(inpVal + " * 2 = " + retVal); 
//> 11 * 2 = 22

-8

もう1つは閉じているようです。だから基本的にここに私のコードの大まかなものがあります。文字列cmdコメントが欠落していると思います。たとえば、私のストアドプロシージャがcall:DBO.Testの場合です。cmd = "DBO.test"と書く必要があります。次に、ストアドプロシージャと同じコマンドタイプを実行し、何とか何とか何とか

Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.