2014-08-29 59 views
1

存儲過程:Visual C#中的存儲過程要求的參數不需要

ALTER PROCEDURE VendorsRowcount 
    @RowCount int OUTPUT 
AS 
    SET NOCOUNT ON 

    SELECT * 
    FROM dbo.Vendors 

    SET @RowCount = @@ROWCOUNT 

    RETURN @RowCount 

C#:

using (var conn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=Pricer;Persist Security Info=True;User ID=xxx;Password=xxx")) 
using (var command = new SqlCommand("VendorsRowcount", conn) 
{ 
    CommandType = CommandType.StoredProcedure 
}) 
{ 
    conn.Open(); 
    command.ExecuteNonQuery(); 
    conn.Close(); 
} 

我收到錯誤:

Additional information: Procedure or function 'VendorsRowcount' expects parameter '@RowCount', which was not supplied.

我只是在學習VB之後學習C#並意識到Internet上的C#有更多的資源。

這可能是一個愚蠢的問題,但我已經搜查過,也許我使用的術語不是正確的,因爲我找不到答案。

據我所知,我不需要發送參數,因爲@RowCount被輸出。

爲什麼我得到這個錯誤?

+3

但是你'@ RowCount'在你的SP? – 2014-08-29 20:50:23

回答

3

如果您在存儲過程中聲明一個參數,它沒有相關聲明爲輸出的事實。你需要從你的C#代碼中傳遞它。另一種方法是將參數聲明爲可選,如另一個答案中所示。但是你現在有一個問題。你如何讀回你的C#代碼中的參數值?

第一個選項,通過參數的存儲過程和讀回

conn.Open(); 
SqlParameter prm = command.Parameters.Add(new SqlParameter("@RowCount", SqlDbType.Int)); 
prm.Direction = ParameterDirection.Output; 
command.ExecuteNonQuery(); 
Console.WriteLine(prm.Value.ToString()); 
conn.Close(); 

第二個選項,設置參數爲可選,調用SqlCommandBuilder.DeriveParameters方法來填補C#側參數的收集和閱讀背部。 (請閱讀提供了有關該解決方案的效率,在鏈接的註釋部分)

-- in the stored procedure 
@RowCount int = 0 OUTPUT 


conn.Open(); 
SqlCommandBuilder.DeriveParameters(command); 
command.ExecuteNonQuery(); 
Console.WriteLine(command.Parameters["@RowCount"].Value.ToString()); 
conn.Close(); 

但是我的事實感到困惑,你運行一個潛在的昂貴SELECT *命令,但不這樣做似乎是有意的記錄返回。

在這種情況下,一個StoredProcedure的似乎是過度的,並增加了維護的問題,而你可以得到的行數簡單地寫:

conn.Open(); 
command.CommandText = "SELECT COUNT(*) FROM Vendors"; 
int rowCount = Convert.ToInt32(command.ExecuteScalar()); 
Console.WriteLine(rowCount.ToString()); 
conn.Close(); 
+0

這工作完美。而且我知道我的代碼會/會很糟糕。我是一名網絡技術人員,而不是程序員。我的工作只是告訴我也要成爲一名程序員,所以我在努力。我有大約3周的VB使用經驗,而且我正忙於C#的第一天。我相信會有更多愚蠢的問題來臨。 – Katp00p 2014-08-29 22:30:14

+0

這似乎與輸入查詢一樣困難。我使用存儲過程,因爲我認爲他們會節省時間。 – Katp00p 2014-08-29 22:33:33

+0

除非真正需要進行復雜的操作或擠壓性能的最後一點,否則我建議遠離SP來進行簡單的SELECT操作。例如,您可以以更簡單的方式獲得記錄的COUNT(*) – Steve 2014-08-29 22:41:48

1

如果參數應該是可選的,則必須在存儲過程中提供默認值。

例如: @RowCount INT輸出= 0