【问题标题】:SQL Stored Procedures failing to return valuesSQL 存储过程无法返回值
【发布时间】:2010-09-07 19:45:10
【问题描述】:

我正在为用 ASP.NET 设计的新闻页面开发标签系统。对于系统,我需要一个 TagExists 方法来检查数据库中的标签。我写的存储过程如下。

ALTER PROCEDURE [dbo].[Tags_TagExists](
    @Tag varchar(50))
AS
BEGIN
    If (EXISTS(SELECT * FROM dbo.Tags WHERE LOWER(@Tag) = LOWER(Tag)))
        RETURN 1
    ELSE
        RETURN 0
END

当我调用此方法时,总是返回 0。我正在使用下面的代码来调用方法

Public Shared Function TagExists(ByVal name As String) As Boolean
    Dim result As Boolean
    Using conn As SqlConnection = New SqlConnection(ConnectionString)
        Dim cmd As New SqlCommand("Tags_TagExists", conn)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@Tag", name)
        conn.Open()
        result = Convert.ToBoolean(cmd.ExecuteScalar())
        conn.Close()
    End Using
    Return result
End Function

我已经尝试切换过程,如果标签存在则返回 0,如果不存在则返回 1,尽管测试条件完全相同,它仍然返回 0。我还返回了实际的选择查询,它抱怨标签“新闻”(我的测试项目)在执行时不是一个 int,表明选择本身肯定是正确形成的。

如果有人能对此有所了解,谢谢 迈克尔

【问题讨论】:

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


    【解决方案1】:

    它应该是一个函数,但这里是存储的过程代码:

    ALTER PROCEDURE [dbo].[Tags_TagExists](
        @Tag varchar(50))
    AS
    BEGIN
        If EXISTS(SELECT 1 FROM dbo.Tags WHERE LOWER(@Tag) = LOWER(Tag))
            BEGIN
                SELECT 1
            END    
        ELSE
            BEGIN
                SELECT 0
            END
    END
    

    【讨论】:

    • 请解释 aspnet_Roles_RoleExists 如何使用 return 而不是 select,我不明白为什么它在那里工作而不是在这里
    • @Mikey:检索存储过程返回值的代码与检索结果集的代码不同。有关检索返回值的代码,请参阅 Justin Niessner 的答案。
    【解决方案2】:

    您正在从存储过程返回,而不是从 SQL 语句中获取单个标量值。

    我假设这是一个简单的示例,并且您有其他要在存储过程中处理的处理。在这种情况下,使用存储过程和返回值是正确的方法。您需要在 C# 代码中处理存储过程的返回值(请原谅任何语法错误,我的 VB.NET 有点生疏):

    Public Shared Function TagExists(ByVal name As String) As Boolean
        Dim result As Boolean
        Using conn As SqlConnection = New SqlConnection(ConnectionString)
            Dim cmd As New SqlCommand("Tags_TagExists", conn)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.AddWithValue("@Tag", name).
    
            Dim retVal As SqlParameter = _
                cmd.Parameters.Add("return_value", SqlDbType.Int)
            retval.Direction = ParameterDirection.ReturnValue
    
            conn.Open()
            cmd.ExecuteNonQuery()
    
            result = System.Convert.ToBoolean(retval.Value)
    
            conn.Close()
        End Using
        Return result
    End Function
    

    如果您对返回值非常感兴趣并且您的存储过程没有执行任何其他用途,则将其转换为简单的选择语句(或函数)。在这种情况下,您可以使用 ExecuteScalar

    【讨论】:

    • 太棒了,感谢您为我解决了这部分问题
    【解决方案3】:

    请尝试使用 SELECT 1 和 SELECT 0 代替 RETURN 语句

    希望对你有帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 2018-04-03
      相关资源
      最近更新 更多