【问题标题】:Passing auto incremented id through multiple forms通过多个表单传递自动递增的 id
【发布时间】:2011-06-14 14:31:40
【问题描述】:

需要有关使自动递增的 id 在多个表单上保持相同的最佳方法的建议。

基本上,我使用带有 SQL Server 作为后端的 VB .Net。我写了一些存储过程来插入数据,然后我在前端调用存储过程。我有 3 个表单,一旦提交第一个表单,它会生成一个 autoID,然后将用户带到第二个表单。

在第二种形式中,我有一个单独的插入存储过程,有没有一种方法可以获取第一种形式生成的 id 并使其保持一致。或者我应该在他们提交表单后将它存储在一个变量中,然后在第二种表单中调用它。

我阅读了有关 @@Identity 的信息,但这仅在该会话中获取 id,因为我提交第一个表单数据然后转到第二个表单数据不会是另一个会话。

谢谢

【问题讨论】:

  • 永远不要将@@identity 用于此目的,这是不可靠的。请改用 scope_identity() 或输出子句。

标签: sql-server vb.net tsql


【解决方案1】:

您的存储过程可以返回标识值(使用输出子句或 scope_identity() 来获取它)作为输出变量,您可以将其作为变量存储在应用程序中,然后就可以使用了。当人员移动到不同的记录并且在所有关联的格式都插入了记录之后,您需要确保将变量清空,这样您就不会在其他时间无意中使用它。

您永远不想为此使用@@identity,因为它不可靠,并且可能会产生大量数据完整性问题,因为如果有人添加了插入另一个具有标识的表的触发器,它会给您错误的值。

【讨论】:

  • 我试图做的是将这行代码添加到我的存储过程中 SELECT id from mytable where id = @id 但是后来我不知道如何让它在前端工作没有 id 参数可以传递它。你是说我应该将 id= @@scope_identity() 添加到存储过程中,它会知道从 mytable 中获取它
【解决方案2】:

这会导致您出现问题,这可能表明这不是最好的方法。也许相反,使用 DB 上的函数返回 ID,然后在您的 .net 代码中设置它?

如果您有一个自动递增的 ID,那么它应该只在创建记录时递增。您的三个表格是否创建了三个记录?那是你要的吗?如果是这样,那么自动 ID 绝对不是正确的选择。

【讨论】:

  • 我有 3 张不同的桌子。第一个表单提交到一个生成 autoid 的表。第二个表单提交到第二个表是我希望在第一个表中生成的 autoid 跟随并将其添加到第二个表的位置。但是第二种形式是一种全新的形式,如果我没有解释清楚,对不起
【解决方案3】:

我想你可能想多了?

我读到了@@Identity,但它只在该会话中获取 id,因为我提交了第一个表单数据,然后转到第二个不会是另一个会话。

您不想要第一个表单上的条目生成的密钥吗?

在第二种形式中,我有一个单独的插入存储过程,有没有办法获取第一种形式生成的 id 并使其保持一致。或者我应该在他们提交表单后将其存储在一个变量中,然后在第二个表单中调用它。

【讨论】:

  • 你可能是对的我还在学习 vb,我发现自己想了很多东西,因为我还没有完全掌握我在做什么,但我正在阅读并试图理解我在做什么这样做我可以成为一个更好的编程者。只是我读的越多,有时我读的东西就越让我困惑
  • 我确实想获取第一个表单生成的密钥,除非我放入存储过程 @id = scope_identity() 我不确定如何在 vb 中将它生成的 id 传递给第二个表单形式。我正在阅读有关全局变量的信息,这是正确的方法吗?创建一个全局变量并在用户单击提交按钮时将其传递给第二个表单
  • 抱歉,对 VB 的了解不够,无法回答这个问题。在 C# 中,您可以使用一些肉类方法来执行存储过程,这些过程会返回一个数据表。在插入后存储的过程中说选择@@identity。然后在 C# 中你会有类似 result.rows[0][0].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2019-03-23
  • 2010-10-04
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多