我正在尝试从C#windows应用程序调用存储过程。存储过程在SQL Server 2008的本地实例上运行。我能够调用存储过程但我无法从存储过程中检索该值。该存储过程应该返回序列中的下一个数字。我在网上做过研究,我见过的所有网站都指出这个解决方案有效。
存储过程代码:
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
检索具有相同结果的返回值。我错过了什么
我的存储过程的返回值?如果需要更多信息,请告诉我。
答案 0 :(得分:124)
您需要将return参数添加到命令:
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 :(得分:4)
ExecuteScalar()将起作用,但输出参数将是一个优秀的解决方案。
答案 2 :(得分:4)
我知道这已经过时了,但我偶然发现了谷歌。
如果您的存储过程中有返回值,请说"返回1" - 不使用输出参数。
您可以执行以下操作 - " @ RETURN_VALUE"被静默地添加到每个命令对象中。无需明确添加
cmd.ExecuteNonQuery();
rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
答案 3 :(得分:3)
我机器上的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;
答案 4 :(得分:2)
答案 5 :(得分:2)
我遇到类似的问题,SP调用返回错误,指出未包含预期参数。我的代码如下。
存储过程:
@Result int OUTPUT
和C#:
SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32)); result.Direction = ParameterDirection.ReturnValue;
在故障排除中,我意识到存储过程实际上正在寻找" InputOutput"的方向。所以以下更改解决了问题。
r
Result.Direction = ParameterDirection.InputOutput;
答案 6 :(得分:0)
或者如果您使用的是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;
}
答案 7 :(得分:0)
这是从过程中返回单个值的非常简短的示例:
SQL:
CREATE PROCEDURE [dbo].[MakeDouble] @InpVal int AS BEGIN
SELECT @InpVal * 2; RETURN 0;
END
C#代码:
int inpVal = 11;
string retVal = "?";
using (var sqlCon = new SqlConnection(
"Data Source = . ; Initial Catalog = SampleDb; Integrated Security = True;"))
{
sqlCon.Open();
retVal = new SqlCommand("Exec dbo.MakeDouble " + inpVal + ";",
sqlCon).ExecuteScalar().ToString();
sqlCon.Close();
}
Debug.Print(inpVal + " * 2 = " + retVal);
//> 11 * 2 = 22
答案 8 :(得分:-6)
我看到另一个人关闭了。所以基本上我的代码很粗糙。我想你错过了字符串cmd评论。例如,如果我的商店程序是调用:DBO.Test。我需要写cmd =" DBO.test"。然后执行命令类型等于存储过程,并等等等等等等等
Connection.open();
String cmd="DBO.test"; //the command
Sqlcommand mycommand;