programing

반환 값을 사용하여 스토어드 프로시저를 호출합니다.

topblog 2023. 4. 13. 20:29
반응형

반환 값을 사용하여 스토어드 프로시저를 호출합니다.

C# 윈도 어플리케이션에서 스토어드 프로시저를 호출하려고 합니다.저장 프로시저는 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같은 결과로 반환값을 가져옵니다.저장 프로시저에서 반환값을 얻으려면 무엇이 부족합니까?더 필요한 정보가 있으면 알려주세요.

를 추가해야 합니다.ReturnValue명령어에 대한 -direction 파라미터:

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

    // @ReturnVal could be any name
    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;

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

파라미터의 방향 설정ParameterDirection.ReturnValue명령어SqlCommand변수를 변수로 선언하고 저장 프로시저의 반환 값을 변수에 할당합니다(exec @ReturnValue = spMyProcedure...SQL에 쓰는 것과 똑같습니다.

오래된 건 알지만 구글에서 우연히 발견했어요.

저장 프로시저에 반환 값이 있는 경우 출력 파라미터를 사용하지 않고 "Return 1"이라고 입력합니다.

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

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

컴퓨터에 설치된 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;

SP 콜에서 예상 파라미터가 포함되지 않은 오류를 반환하는 것과 같은 문제가 발생했습니다.내 코드는 다음과 같았다.
저장 프로시저:

@결과 int 출력

그리고 C#:

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

트러블 슈팅에서는 스토어드 프로시저가 실제로는 「InputOutput」의 방향을 찾고 있는 것을 깨달았습니다.따라서 다음 변경으로 문제가 해결되었습니다.

            r

Result.Direction = ParameterDirection.입력 출력

다음은 절차에서 단일 값을 반환하는 매우 짧은 예입니다.

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

ExecuteScalar();동작하지만 출력 파라미터가 뛰어난 솔루션이 됩니다.

출력 파라미터를 사용해 볼 수 있습니다.http://msdn.microsoft.com/en-us/library/ms378108.aspx

또는 표준 ADO가 아닌 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;
}

다른 하나는 닫았군요.그래서 기본적으로 여기 제 암호의 대략적인 내용이 있습니다.문자열 cmd 코멘트가 누락된 것 같습니다.예를 들어, 스토어 프로시저가 call인 경우:DBO. 테스트.cmd="DBO.test"라고 써야 합니다.그러면 명령어 타입을 스토어 프로시저와 동일하게 하여 blah blah blah

Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;

언급URL : https://stackoverflow.com/questions/6210027/calling-stored-procedure-with-return-value

반응형