用返回值调用存储过程

我想从我的C#窗口应用程序调用存储过程。 存储过程在SQL Server 2008的本地实例上运行。我能够调用存储过程,但是我无法从存储过程中取回值。 这个存储过程应该返回序列中的下一个数字。 我在网上做了研究,所有我见过的网站都指出了这个解决scheme的工作原理。

存储过程代码:

ALTER procedure [dbo].[usp_GetNewSeqVal] @SeqName nvarchar(255) as begin declare @NewSeqVal int set NOCOUNT ON update AllSequences set @NewSeqVal = CurrVal = CurrVal+Incr where SeqName = @SeqName if @@rowcount = 0 begin print 'Sequence does not exist' return end return @NewSeqVal end 

调用存储过程的代码:

 SqlConnection conn = new SqlConnection(getConnectionString()); conn.Open(); SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn); cmd.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter(); param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar); param.Direction = ParameterDirection.Input; param.Value = "SeqName"; SqlDataReader reader = cmd.ExecuteReader(); 

我也尝试使用DataSet来检索具有相同结果的返回值。 我错过了从我的存储过程获取返回值? 如果需要更多信息,请告诉我。

您需要将返回参数添加到命令中:

 using (SqlConnection conn = new SqlConnection(getConnectionString())) using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = parameterStatement.getQuery(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("SeqName", "SeqNameValue"); var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); returnParameter.Direction = ParameterDirection.ReturnValue; conn.Open(); cmd.ExecuteNonQuery(); var result = returnParameter.Value; } 

我知道这是旧的,但我偶然发现与谷歌。

如果您的存储过程中有返回值,则说“返回1” – 不使用输出参数。

您可以执行以下操作 – 将“@RETURN_VALUE”静默添加到每个命令对象。 不需要明确添加

  cmd.ExecuteNonQuery(); rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value; 

ExecuteScalar()将工作,但输出参数将是一个优秀的解决scheme。

您可以尝试使用输出参数。 http://msdn.microsoft.com/en-us/library/ms378108.aspx

我的机器上的EnterpriseLibrary版本有其他参数。 这是工作:

  SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int); retval.Direction = System.Data.ParameterDirection.ReturnValue; cmd.Parameters.Add(retval); db.ExecuteNonQuery(cmd); object o = cmd.Parameters["@ReturnValue"].Value; 

或者,如果您使用EnterpriseLibrary而不是标准的ADO.NET …

 Database db = DatabaseFactory.CreateDatabase(); using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal")) { db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue"); db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null); db.ExecuteNonQuery(cmd); var result = (int)cmd.Parameters["RetVal"].Value; } 

我有一个类似的问题与SP调用返回一个错误,预期的参数不包括在内。 我的代码如下。
存储过程:

@Result int OUTPUT

和C#:

  SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32)); result.Direction = ParameterDirection.ReturnValue; 

在排除故障时,我意识到存储过程是ACTUALLY寻找“input输出”的方向,所以下面的修改解决了这个问题。

  r 

Result.Direction = ParameterDirection.InputOutput;

我看到另一个已经closures了。 所以基本上这是我的代码粗糙。 我想你错过了stringCMD评论。 例如,如果我的商店程序是调用:DBO.Test。 我需要写cmd =“DBO.test”。 然后做命令types等于存储过程,等等等等等等等等

 Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand;