2010-09-07 107 views
2

我正在为ASP.NET中设计的新闻页面使用标记系统。对于该系统,我需要一个TagExists方法来检查数据库中的标签。下面是我写的存储过程。SQL存储过程无法返回值

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 

我已经尝试切换的过程,如果标签存在,1,如果它不,它仍然不顾完全相同的测试条件返回0,返回0。我也返回了实际的select查询,并且它抱怨Tag“news”(我的测试项目)不是执行时的int,它显示select本身肯定是正确组建的。

如果任何人都可以提供一些线索这光,感谢 迈克尔

回答

6

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

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 
+0

完美的工作 – 2010-09-07 19:54:17

+0

请解释aspnet_Roles_RoleExists如何使用return而不是select,我看不出为什么它在那里工作而不在这里 – 2010-09-07 19:55:32

+0

@Mikey:检索存储过程的返回值的代码与检索结果集的代码不同。查看Justin Niessner的代码来获取返回值的答案。 – 2010-09-07 19:56:53

0

请尝试使用SELECT 1和SELECT 0而不是RETURN语句

希望帮助,

1

你从一个存储过程返回时,没有得到一个单一的财政来自SQL语句的ar值。

我假设这是一个简单的例子,你有其他处理你想要在存储过程中处理。在这种情况下,使用存储过程和返回值是正确的选择。您需要处理在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 

如果您在返回值严格感兴趣,您的存储过程不会执行任何其他用途,然后将其转换为简单的select语句(或函数)。在这种情况下,您使用ExecuteScalar将起作用。

+0

真棒,感谢您为我解决这部分问题 – 2010-09-07 19:59:01