web-dev-qa-db-ja.com

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

C#Windowsアプリケーションからストアドプロシージャを呼び出そうとしています。ストアドプロシージャは、SQL Server 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を使用して、同じ結果の戻り値を取得しようとしました。ストアドプロシージャから戻り値を取得するために何が欠けていますか?さらに情報が必要な場合は、お知らせください。

69
Wesley

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

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;
}
132
Alex Aza

ExecuteScalar()は機能しますが、出力パラメーターが優れたソリューションになります。

4
Justin Dearing

私はこれが古いことを知っていますが、Googleでつまずきました。

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

次のことができます-「@RETURN_VALUE」はすべてのコマンドオブジェクトに静かに追加されます。明示的に追加する必要はありません

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

マシン上の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;
4
RaSor

出力パラメーターを使用してみてください。 http://msdn.Microsoft.com/en-us/library/ms378108.aspx

2
Aravind

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

@Result int OUTPUT

C#:

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

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

            r

Result.Direction = ParameterDirection.InputOutput;

2
Paul

または、標準の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
Dunc