2013-08-16 2 views
0

У меня есть хранимая процедура, подобная этой, и когда я запускаю эту хранимую процедуру в SQL Server Management Studio, я получаю команду «успешно завершена».Проверьте, имеет ли значение значение, возвращаемое из хранимой процедуры?

Как в моем коде vb.net с простым оператором if Я могу проверить, что @onum 0 сделать что-то.

Я никогда не работаю с этим видом, обычно хранимые процедуры возвращают пустую строку, когда она не имеет значения.

ALTER PROCEDURE [dbo].[o_By_RNum] 
    @rNum varchar(50) 
    ,@ServiceType varchar(50) 
    ,@Direction varchar(1) = NULL 
    ,@VendorID int 
AS 
    Declare @onum int 

    If @Direction is Null 
    Begin 
     SELECT @onum = o_num 
     FROM RemoteOrder 
     WHERE r_num LIKE @rNum 
     AND r_ServiceType = @ServiceType 
     AND VendorID = @VendorID 
    End 
    Else 
    Begin 
     SELECT @onum = o_num 
     FROM RemoteOrder 
     WHERE r_num LIKE @rNum 
     AND r_ServiceType = @ServiceType 
     AND Direction = @Direction 
     AND VendorID = @VendorID 
    End 

    RETURN ISNULL(@onum,0) 

и я зову эту хранимую процедуру в моем vb.net кода:

Private Sub DLL_GetOnumFromRemoteOrder_By_RNum(ByRef SqlConn As SqlConnection, ByRef R_NUM As String, ByRef R_SERVICETYPE As String, ByRef DIRECTION As String, ByRef VENDORID As Integer, ByRef RetVal As Integer) 

    'Open the SQL Connection 
    If SqlConn.State <> ConnectionState.Open Then SqlConn.Open() 

    'Add Parameters 
    Dim command As New SqlCommand("DLL_GetOnumFromRemoteOrder_By_RNum", SqlConn) 
    command.CommandType = CommandType.StoredProcedure 
    command.Parameters.Add("@rNum", SqlDbType.VarChar).Value = IIf(IsNothing(R_NUM), DBNull.Value, R_NUM) 
    command.Parameters.Add("@ServiceType", SqlDbType.VarChar).Value = IIf(IsNothing(R_SERVICETYPE), DBNull.Value, R_SERVICETYPE) 
    command.Parameters.Add("@Direction", SqlDbType.Char).Value = IIf(IsNothing(DIRECTION), DBNull.Value, DIRECTION) 
    command.Parameters.Add("@VendorID", SqlDbType.Int).Value = IIf(IsNothing(VENDORID), DBNull.Value, VENDORID) 

    command.Parameters.Add("@RETURN_VALUE", SqlDbType.Int) 
    command.Parameters("@RETURN_VALUE").Direction = ParameterDirection.ReturnValue 

    'Dim dr As SqlDataReader 
    'dr = command.ExecuteReader() 
    'dr.Read() 
    'Return dr 
    'Execute the command 
    RetVal = command.ExecuteNonQuery() 
    RetVal = CInt(command.Parameters.Item("@RETURN_VALUE").Value) 
End Sub 
+0

Вы выполняете команду 'ExecuteNonQuery', поэтому вы не получите никаких строк. Выполните команду ExecuteReader для получения строк. – GSerg

+0

Я не получаю строку при запуске магазина в студии управления. и они попросили меня поставить оператор if, чтобы проверить, является ли onum null или 0 делать что-то, как я получаю onum, когда store proc ничего не возвращает? – Alma

+0

Он возвращает 'isnull (@ onum, 0)' как [его возвращаемое значение] (http://stackoverflow.com/a/8619015/11683). – GSerg

ответ

0

Проблема, как представляется, в объявлении возвращаемого параметра, так как нет необходимости чтобы дать ему имя или тип, так как возвращаемое значение всегда является int. This question также имеет такую ​​же проблему. Код, который они предлагают, будет примерно таким:

Dim RetvalParameter As SqlParameter = command.Parameters.Add() 
RetvalParameter.Direction = ParameterDirection.ReturnValue 

command.ExecuteNonQuery() 
RetVal = CInt(RetvalParameter.Value) 
0

Изменить хранимую процедуру для:

ALTER PROCEDURE [dbo].[o_By_RNum] 

@rNum varchar(50) 
,@ServiceType varchar(50) 
,@Direction varchar(1) = NULL 
,@VendorID int 
AS 
BEGIN 

    SELECT ISNULL(o_num,0) 
    FROM RemoteOrder 
    WHERE r_num LIKE @rNum 
    AND r_ServiceType = @ServiceType 
    AND (@Direction is Null OR Direction = @Direction) 
    AND VendorID = @VendorID 
    END 

Таким образом, вы будете иметь фактические ВЫБРАТЬ который покажет результаты в Management Studio.

Тогда вместо последних 4 строки после

command.Parameters.Add("@VendorID", SqlDbType.Int).Value = IIf(IsNothing(VENDORID), DBNull.Value, VENDORID) 

что добавить параметр return_value и ExecuteNonQuery вобще

RetVal = command.ExecuteScalar() 
Смежные вопросы