我有一個存儲過程,用於選擇並返回一個年份列表。在sql服務器我這樣稱呼它:在c上檢索存儲過程的結果#
DECLARE @return_value int
EXEC @return_value = [dbo].[TestName]
@del= 0
SELECT 'Return Value' = @return_value
爲了接收列表。
我的SP是這樣的:
USE [TestTable]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[TestName] (@delvarchar(7))
AS
BEGIN
SELECT YEAR( [added]) AS year FROM [MyTable]
GROUP BY YEAR( [added])
ORDER BY YEAR( [added]) DESC
END
我想要做的從C#一樣,雖然並以列表值傳遞。
我試圖爲:
using (var conn = new SqlConnection(constr))
using (var command = new SqlCommand("TestName", conn)
{
CommandType = CommandType.StoredProcedure
})
{
command.Parameters.AddWithValue("@del", del);
SqlParameter retval = command.Parameters.Add("@return_value", SqlDbType.VarChar);
retval.Direction = ParameterDirection.ReturnValue;
conn.Open();
command.ExecuteNonQuery();
int retunvalue = (int)command.Parameters["@return_value"].Value;
conn.Close();
return retunvalue;
}
,這並不會返回任何值,而是它只返回0
。我在做什麼錯了,我怎麼能得到指定的變量內的列表?
編輯下面約翰漢娜的通知代碼,我有這樣的事情:
public List<string> getYears(string constr, int del)
{
using (var conn = new SqlConnection(constr))
using (var command = new SqlCommand("TestName", conn)
{
CommandType = CommandType.StoredProcedure
})
{
command.Parameters.AddWithValue("@del", del);
List<string> retunvalue = new List<string>();
conn.Open();
SqlDataReader reader;
reader = command.ExecuteReader();
conn.Close();
return retunvalue;
}
}
並通過以探討reader
添加一個斷點我看到它是隻包含錯誤:
Depth = '(reader).Depth' threw an exception of type 'System.InvalidOperationException'
至於克里希納的回答,dtList
是空的,計數爲0,我不知道如何實施Badhon的建議。
C#代碼看起來是正確的讀取返回值。您應該發佈SP以及問題可能在那裏(例如,您可能使用SELECT而不是RETURN返回值)。 –