【问题标题】:Returning scope identity using sqlCommand.ExecuteNonQuery()使用 sqlCommand.ExecuteNonQuery() 返回作用域标识
【发布时间】:2011-12-13 17:03:09
【问题描述】:

我有一个看起来像这样的存储过程。

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,尽管我声明了一个 out 参数并在存储过程退出之前对其进行了设置。记录已成功添加 ID 的自动递增值,但当我返回输出参数时,未返回 ID。它设置为 0。

有什么建议吗?

【问题讨论】:

  • 您可以简单地将值作为标量而不是输出参数返回吗?更容易处理,恕我直言。
  • 您的代码似乎不正确。您的参数名称定义为 iD(小写 I),SET 语句使用 ID(大写 I),而您获取输出参数值的代码使用完全不同的 APID。您能否发布您正在使用的实际代码?
  • 我在记事本++中修改了我的代码。实际值是正确的。我只是想让它尽可能通用。这不是错误的原因。从那以后我发现了问题所在。

标签: c# asp.net return-value executenonquery


【解决方案1】:

您已经定义了输出参数 - 但是在您致电 .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 的地方??

输出参数不是.ExecuteNonQuery()调用的返回值——调用后需要显式读出参数值。

【讨论】:

  • 是的,我正在代码中的某个地方执行此调用。 APID = Convert.ToInt32(sqlCommand.Parameters["@APID"].Value);当我设置断点并检索此值时为 NULL。所以 Convert.ToInt32 将其设置为 0;
  • 虽然我已经拥有了你建议的一切,但你的回答帮助我发现了真正的问题,所以我赞成它。有 51 个参数,其中一个默认未设置为 NULL,导致语句失败并因此返回 0。
猜你喜欢
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多