【问题标题】:Example of OUTPUT clause to get Identity with ado.net?使用 ado.net 获取身份的 OUTPUT 子句示例?
【发布时间】:2012-02-09 17:09:11
【问题描述】:

我读到使用 OUTPUT 子句可能是检索新插入记录的标识的最佳方式。我很确定我可以编写一个存储过程并调用它,但是我的业务对象使用动态生成的 sql,因此必须使用存储过程会有问题。谁能告诉我如何使用 ado.net 执行带有输出子句的单个输入语句并获取返回的标识值?看起来可能无法完全这样做,但我想我会问......

编辑:好的,这比我想象的要容易......我以为我必须首先输出到一个表变量。但是我现在这样做的方式不太正确,因为它在“插入”新记录之前返回身份。这是我刚刚测试的语句:

INSERT Test (F1)
OUTPUT SCOPE_IDENTITY()
VALUES ('Testing')

每次我这样做时,它都会返回一个比最后插入记录的 Identity 实际值低一个数字的结果。我只会在结果中加 1,但是当我在表之间移动并且最后一个结果来自不同的表时,这当然行不通。

我想知道是否应该使用 IDENT_CURRENT('Test') 并将其加 1,因为它将作为单个事务处理,我不必担心并发问题。

关于如何获得正确结果返回的任何想法?

【问题讨论】:

  • 你是在问如何返回@@IDENTITY 作为存储过程的输出参数,假设有一个插入?

标签: c# sql-server ado.net


【解决方案1】:

如果你的身份字段名称是Id,那么这样使用:

INSERT Test (F1)
OUTPUT INSERTED.Id
VALUES ('Testing')

SCOPE_IDENTITY() 返回的值将在insert 之后发生变化,显然OUTPUT 完成

或者保持简单:

INSERT Test (F1)
VALUES ('Testing')

SELECT SCOPE_IDENTITY()

你甚至不应该知道身份字段是什么。

【讨论】:

  • 谢谢,这就是我最终做的事情,尽管工作量更大,因为我不一定知道名字会是 Id。不幸的是,我认为通过 ReturnValue SqlParameter 取回值不会有任何问题,但我仍然没有让它工作......
  • 是的,我还试图避免使用第二种方法来尽可能保持代码简单(否则我必须将其包装在事务中以确保没有并发问题)。但无论如何,我最终确实完成了能够使用 INSERTED 的工作,我刚刚意识到我可以使用 ExecuteScalar() 来取回值。世界上一切都很好:)
  • Second 完全是事务性的。其他交易从不干扰wintSCOPE_IDENTITY()功能。
  • 除非您将其放入事务中,否则它不是事务性的。在您插入记录并取回值之间,其他人很可能会插入一条记录。或者我在这里错过了什么?我不认为我是,但如果是,请随时纠正我。
  • @BrandonMoore 是的,你失踪了。请参阅此处:msdn.microsoft.com/en-us/library/ms190315.aspx - 此处声明:返回插入在同一范围内的标识列的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多