2016-05-14 57 views
2

此刻我想運行一個存儲過程,該存儲過程返回記錄數。這些記錄是這樣的用於計數返回0作爲計數的SQL Server存儲過程

Records results

存儲過程看起來像

ALTER PROCEDURE [dbo].[USP_NEWFOLDER_COUNT] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT @@ROWCOUNT 
    FROM FileLocation 
END 

調用C#代碼是

public String CountNewFolder() 
{ 
    tempInt = 0; 

    using (SqlConnection sqlCon = new SqlConnection(connString)) 
    { 
     SqlCommand sqlComm = new SqlCommand("USP_NEWFOLDER_COUNT", sqlCon); 
     sqlComm.CommandType = CommandType.StoredProcedure; 

     sqlCon.Open(); 
     tempInt = Convert.ToInt16(sqlComm.ExecuteScalar()); 
     sqlCon.Close(); 
    } 

    return tempInt.ToString(); 
} 

我查詢的結果爲0;

任何幫助或閹牛都會有所幫助。但是,如果可能的話,我可以快速解釋一下,這樣我就不會再犯同樣的錯誤了。

+1

如果您運行查詢SQL Server Management Studio中會發生什麼? – Sybren

+0

@crowcoder有正確的答案,並且在下一張海報前4秒發佈它 –

回答

2

理想情況下,你應該使用OUTPUT參數進行這種操作。像....

ALTER PROCEDURE [dbo].[USP_NEWFOLDER_COUNT] 
@Count INT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT @Count = COUNT(*) 
    FROM FileLocation; 
END 

你的C#代碼的東西會看起來像......

public String CountNewFolder() 
{ 
    tempInt = 0; 

    using (SqlConnection sqlCon = new SqlConnection(connString)) 
    { 
     using(SqlCommand sqlComm = new SqlCommand("USP_NEWFOLDER_COUNT", sqlCon)) 
     { 
     sqlComm.CommandType = CommandType.StoredProcedure; 

     sqlComm.Parameters.Add("@Count", SqlDbType.Int).Direction = ParameterDirection.Output; 

     sqlCon.Open(); 
     sqlComm.ExecuteNonQuery(); 

     tempInt = Convert.ToInt32(sqlComm.Parameters["@Count"].Value); 
     } 
    } 

    return tempInt.ToString(); 
} 
4

您使用@@ROWCOUNT這是返回表中的行數....

使用這個代替:

ALTER PROCEDURE [dbo].[USP_NEWFOLDER_COUNT] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT COUNT(*) 
    FROM FileLocation 
END 

@@ROWCOUNT是獲取後每一個充滿變數SQL語句來顯示最後執行的SQL語句影響了多少行。所以,如果你運行一個SELECT * FROM FileLocation,該命令已運行,那麼後,再@@ROWCOUNT將包含由SELECT聲明 返回的行數(但這是不是做在首位SELECT COUNT(*) FROM FileLocation效率較低)。

4

您對@@ROWCOUNT是什麼有錯誤的想法。這將返回最後一個查詢所處理的行數。你沒有查詢,所以行數爲零。你想:

SELECT COUNT(*) FROM [FileLocation]; 
+0

因此,經典的例子是「沒有閱讀手冊,沒有閱讀手冊,只是顯示我的期望」。 – TomTom