2010-09-07 110 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