2011-12-13 77 views
1

我有一个看起来像这样的存储过程。使用sqlCommand.ExecuteNonQuery()返回作用域标识

ALTER PROCEDURE dbo.addPackage(

    @PackageStatus      VARCHAR(50) = null, 
    @OrgCode       VARCHAR(50) = null, 
    @SystemID       VARCHAR(50) = null, 
    @ID        int OUTPUT 
) 
AS 
BEGIN 
    insert into package_table 
    (
      PackageStatus, 
      OrgCode, 
      SystemID 
      ) 
      values 
      (@PackageStatus, 
      @OrgCode, 
      @SystemID 
      ) 
      SET @ID = SCOPE_IDENTITY() 
END 

而我的函数添加下列参数的SQL命令,并呼吁sqlCommand.ExecuteNonQuery();

List<SqlParameter> parameters = new List<SqlParameter>(); 

parameters.Add(new SqlParameter("@PackageStatus", package.PackageStatus)); 
parameters.Add(new SqlParameter("@OrgCode", package.OrgCode)); 
parameters.Add(new SqlParameter("@SystemID", package.SystemID)); 

SqlParameter outParameter = new SqlParameter("@ID", SqlDbType.Int); 
outParameter.Direction = ParameterDirection.Output; 
parameters.Add(outParameter); 

,但我一直在存储porcuedure得到一个0回evne虽然我有一个输出参数声明,并将其设置在存储过程退出之前。该记录成功添加了ID的自动递增值,但是当我得到输出参数时,ID不会被返回。它设置为0.

有什么建议吗?

+2

您可以简单地将该值作为标量而不是输出参数返回吗?更容易处理,恕我直言。 – sfuqua 2011-12-13 17:06:19

+0

你的代码看起来不正确。你的参数名称被定义为iD(小写字母I),SET语句使用ID(大写字母I)和你的代码来得到输出参数的值使用完全不同的APID。你可以发布你正在使用的实际代码吗? – 2011-12-13 17:17:57

回答

4

你已经定义了输出参数 - 但是你也在你致电.ExecuteNonQuery()之后把它读出来?不幸的是,你不显示的代码......

基本上,你需要

SqlCommand cmd = new SqlCommand(..., connection); ..... 

// set up your parameter as above 

connection.Open(); 
cmd.ExecuteNonQuery(); 

var outputValue = cmd.Parameters["@APID"].Value; // you need to read it out! 

connection.Close(); 

要这样?这就是你一直回到0的地方?

输出参数为NOT来自.ExecuteNonQuery()调用的返回值 - 您需要在调用后明确读出参数值。

相关问题