【问题标题】:Check if a field returning from stored procedure has value?检查从存储过程返回的字段是否有价值?
【发布时间】:2013-08-16 23:14:27
【问题描述】:

我有一个这样的存储过程,当我在 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

【问题讨论】:

  • 您使用ExecuteNonQuery 执行,因此您不会得到任何行。使用ExecuteReader 执行以获取行。
  • 当我在管理工作室中运行 store proc 时,我没有得到该行。他们让我放一个 if 语句来检查 onum 是 null 还是 0 当 store proc 没有返回任何东西时我如何得到 onum?
  • 它以its return value 的形式返回isnull(@onum,0)

标签: sql sql-server vb.net stored-procedures


【解决方案1】:

问题似乎在返回参数的声明中,因为没有必要给它一个名称或类型,因为返回值总是一个 int。 This question 也有同样的问题。他们建议的代码是这样的:

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

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

【讨论】:

    【解决方案2】:

    将存储过程更改为:

     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 中显示结果的实际 SELECT。

    然后,而不是后面的最后 4 行

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

    添加 RETURN_VALUE 参数和 ExecuteNonQuery 就可以了

    RetVal = command.ExecuteScalar()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2013-01-27
      相关资源
      最近更新 更多