用返回值调用存储过程
我想从我的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。
我的机器上的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;