VB.NET

2013-09-27 2 views
1
에 저장 프로 시저에서 반환 값을 얻기

나는 다음과 같은 저장 프로 시저가 있습니다VB.NET

Dim sqlConnection As New SqlConnection(MSSQL_Helper.strConnectionBookit) 
     Dim command As New SqlCommand("BK_NUMBER", sqlConnection) 
     command.CommandType = CommandType.StoredProcedure 
     command.Parameters.Add("@Category", SqlDbType.Int).Value = ID 
     Dim returnParameter As SqlParameter = command.Parameters.Add("RetVal", SqlDbType.Int) 
     returnParameter.Direction = ParameterDirection.ReturnValue 
     sqlConnection.Open() 
     command.ExecuteNonQuery() 
     sqlConnection.Close() 
     Dim returnValue As Integer = returnParameter.Value 
     Return returnValue 

하지만 "항상 0을 반환 :이 VB 코드 @newRunningNumber를 얻으려고

ALTER PROCEDURE [dbo].[BK_NUMBER] 
    (@Category NUMERIC(38, 0)) 
WITH EXECUTE AS CALLER 
AS 
    DECLARE @RunningNumber Int 
    DECLARE @min Int 
    DECLARE @max Int 
    DECLARE @newRunningNumber Int 

    BEGIN 

     SELECT @RunningNumber = RunningNumber 
     FROM PARKMARKENNUMMER 
     WHERE PARKMARKENTYP_ID = @Category 

     UPDATE PARKMARKENNUMMER 
     SET RUNNINGNUMBER = @RunningNumber + 1 
     WHERE PARKMARKENTYP_ID = @Category 

     SELECT @newRunningNumber = RunningNumber 
     FROM PARKMARKENNUMMER 
     WHERE PARKMARKENTYP_ID = @Category 

     RETURN @newRunningNumber; 
End; 

을 ". 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

매개 변수로 전달하는 범주에 대해 SQL Server에서 SP를 실행하고 0을 반환하지 않는 것으로 확인 했습니까? –

+3

반환 값이 아닌 OUTPUT 매개 변수를 사용하십시오. 반환 값은 데이터가 아니라 오류/상태 코드입니다. –

+0

DB를 보면 PARKMARKENNUMMER의 RunningNumber에 값이 있습니까? null의 경우, add는 null를 제공해 영속화합니다. – asantaballa

답변

5

당신은 실제로 값을 반환하지 않는 : 로, 그러나

RETURN @newRunningNumber 

을 아론 버트 랜드는 당신이 밖으로 다시 SELECT에게 그것을 OUTPUT 매개 변수로 설정하거나해야 하나 말했다.

출력 :

ALTER PROCEDURE [dbo].[BK_NUMBER] 
(
    @Category NUMERIC(38, 0), 
    @newRunningNumber INT 
) 

Dim newRunningNumber As SqlParameter("@newRunningNumber", SqlDbType.Int) 
newRunningNumber.Direction = ParameterDirection.Output 
// execute 
Dim returnValue As Integer = newRunningNumber.Value 

SELECT :

SELECT @newRunningNumber AS NewRunningNumber 

Dim returnValue As Integer = CType(command.ExecuteScalar(), Integer) 
1

내가 다른 게시물에 동의하지만, 출력 매개 변수, 대부분의 사람들은 당신이 하나 이상을 넣을 수 있다는 걸 해달라고 갈 수있는 방법입니다 명령 텍스트에 줄을 치십시오. 가능한 경우 DBA가 수행 한 작업을 저장 프로 시저를 변경하지 않고 사용할 수있는 것으로 변환 할 수 있습니다. 예를 들어 :

CMD.CommandText = "DECLARE @return_value int;EXEC @return_value = [dbo].[BK_NUMBER] (@Category = " & ID & ";SELECT @return_value" 
Dim Ret as int32 = CMD.ExecuteScalar 

이것은 당신이 할 수있는 일의 단지 예입니다. 주입을 피하고 적절한 오류 처리 등을하는 거친 사용 매개 변수가 있어야합니다.