2011-08-17 8 views
0

我想调用ASP.NET页面中的存储过程并获取其返回值。这里是我的代码:ASP.net调用SQL Server存储过程的问题。

//Something 
MyConnection.Open(); 
SqlDataReader reader = MyCommand.ExecuteReader(); 

if (reader.Read()) 
{ 
    if (returnParameter != null) 
     result = Convert.ToInt32(reader[returnParameter.ParameterName]); 
} 
//Something else 

一切工作正常,除了reader.Read()总是返回假的,所以我不能得到返回值。并执行存储过程。这是从服务器端确认的。没有例外提出。

什么问题?

+0

它的商店** d **程序 - 程序** **存储的SQL Server中(与商店无关) –

+0

你能告诉我们你的存储过程的定义吗?你通过什么参数,你期望退出哪些参数? –

回答

2

您使用的是返回值(使用RETURN语句)还是输出参数?如果是,那么ExecuteReader是错误的选择。仅当SP使用SELECT语句输出数据时,ExecuteReader才会返回数据。你应该使用带有返回参数的ExecuteNonQuery。例如(从MSDN的引用),

CREATE PROCEDURE dbo.InsertCategory 
    @CategoryName nvarchar(15), 
    @Identity int OUT 
AS 
INSERT INTO Categories (CategoryName) VALUES(@CategoryName) 
SET @Identity = SCOPE_IDENTITY() 
RETURN @@ROWCOUNT 

和代码将

// Assumes connection is a valid SqlConnection. 
SqlCommand command = new SqlCommand("InsertCategory" , connection); 
command.CommandType = CommandType.StoredProcedure; 

SqlParameter parameter = command.Parameters.Add(
    "@RowCount", SqlDbType.Int); 
parameter.Direction = ParameterDirection.ReturnValue; 

parameter = command.Parameters.Add(
    "@CategoryName", SqlDbType.NChar, 15); 

parameter = command.Parameters.Add("@Identity", SqlDbType.Int); 
parameter.Direction = ParameterDirection.Output; 

command.Parameters["@CategoryName"].Value = "New Category"; 
command.ExecuteNonQuery(); 

Int32 categoryID = (Int32) command.Parameters["@Identity"].Value; 
Int32 rowCount = (Int32) command.Parameters["@RowCount"].Value; 

http://msdn.microsoft.com/en-us/library/3btz0xwf.aspx

+0

谢谢。我想通了,解决方案是完全一样的。 – AKFish

0

您必须通读结果集中的最后一条记录,而不仅仅是第一条,才能获取返回值。

+0

感谢您的回复。但是我的问题是读者。即使是第一次,读()也总是假的。 – AKFish