반환 값으로 저장 프로 시저 호출


82

내 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동일한 결과로 반환 값을 검색하기 위해를 사용했습니다 . 내 저장 프로 시저에서 반환 값을 얻으려면 무엇을 놓치고 있습니까? 더 많은 정보가 필요하면 알려주세요.

답변:


165

명령에 반환 매개 변수를 추가해야합니다.

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
아니, 당신은 (에 ReturnValue로 표시된 매개 변수를 작성 return 문 트리거) SP로 추가 할 필요가 없습니다
ufosnowcat

10
return val 매개 변수 btw의 이름은 중요하지 않습니다.
Clay

고마워요, 제대로 반환 값을 얻을 수있는 방법을 찾고 있었는데, 이것은 정말 저에게 효과적이었습니다. 대박!
Oswaldo Zapata

4
저장 프로 시저 반환 값은 데이터를 반환하지 않고 성공 (0) 또는 실패 / 경고 (0이 아님)를 나타내는 데만 사용해야합니다. OUTPUT해당 목적을 위해 매개 변수 또는 결과 세트를 사용하십시오 .
Dan Guzman

5

나는 이것이 오래된 것을 알고 있지만 Google에서 우연히 발견했습니다.

저장 프로 시저에 반환 값이있는 경우 출력 매개 변수를 사용하지 않고 "Return 1"이라고 말합니다.

다음을 수행 할 수 있습니다. "@RETURN_VALUE"가 모든 명령 개체에 자동으로 추가됩니다. 명시 적으로 추가 할 필요 없음

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

2
안녕 게리. 인용이 있습니까?
Michael

5
cmd 인스턴스가 명시 적으로 추가되지 않는 한 SqlParameterCollection의 RETURN_VALUE라는 매개 변수를 가질 것이라고 생각하지 않습니다. 따라서 Gary가 위의 접근 방식을 고려하고 있다면 cmd.Parameters.Add (new SqlParameter ( "@ RETURN_VALUE", SqlDbType.Int)); cmd.Parameters [ "@ RETURN_VALUE"]. Direction = ParameterDirection.ReturnValue; 그러나 저장 프로 시저 정의에 @RETURN_VALUE를 추가 할 필요가 없다고 생각합니다. 아마도 그것이 Gary가 의미 한 바일 것입니다.
jbooker

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;

3

ExecuteScalar(); 작동하지만 출력 매개 변수가 더 나은 솔루션이 될 것입니다.


7
반환 값을 "선택"하지 않으면 ExecuteScalar ()가 작동하지 않습니다.
Soori


2

예상 매개 변수가 포함되지 않았다는 오류를 반환하는 SP 호출과 비슷한 문제가 발생했습니다. 내 코드는 다음과 같습니다.
저장 프로 시저 :

@ 결과 int 출력

그리고 C # :

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

문제 해결 과정에서 저장 프로 시저가 실제로 "InputOutput"방향을 찾고 있다는 것을 깨달았으므로 다음 변경으로 문제가 해결되었습니다.

            r

Result.Direction = ParameterDirection.InputOutput;


1
"출력 매개 변수"는 저장 프로 시저 반환 값 btw와 동일하지 않습니다.
Dai

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

다른 하나는 닫혀 있습니다. 그래서 기본적으로 여기에 내 코드의 대략적인 내용이 있습니다. cmd 주석 문자열이 누락되었다고 생각합니다. 예를 들어 내 저장 프로 시저가 call : DBO.Test 인 경우. cmd = "DBO.test"를 작성해야합니다. 그런 다음 저장 프로 시저와 동일한 명령 유형을 수행하고 blah blah blah

Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.