【问题标题】:Can I get the primary key of an inserted row, using ODBC?我可以使用 ODBC 获取插入行的主键吗?
【发布时间】:2009-05-15 02:21:59
【问题描述】:

在 .NET 中使用 ODBC 对象时,检索插入行的主键的最佳方法是什么?

例如(VB):

Dim command As OdbcCommand = gOdbcConn.CreateCommand()
command.CommandText("INSERT INTO auhinode (node_key, node_desc) VALUES (0, 'New Node')")
...
Dim result As Integer = command.ExecuteNonQuery()

我看到了一些其他建议here,但我想知道是否有特定于 ODBC 对象的解决方案?

编辑:我们使用 ODBC 的原因是因为我们支持 3 种不同的数据库 - SQL Server、Oracle、Informix。

【问题讨论】:

  • 在插入之前您已经知道 mode_key 的值(零),所以只需将 'promate' mode_key 作为'primary' key :)
  • ...或者是否有您没有告诉我们的自动增量或类似的自动生成值(例如 SQL Server IDENTITY)?
  • “我们使用 ODBC 的原因是因为我们支持 3 种不同的数据库 - SQL Server、Oracle、Informix。” -> 这不会强迫您使用 ODBC...ADO.NET 2.0 有一个很好的抽象模型,请参阅 System.Data.Common 命名空间

标签: .net sql odbc


【解决方案1】:

您不会找到一种适用于所有 3 个数据库引擎的方法。它们每个都有不同的方法来获取您刚刚插入的行的 ID。

选择 scope_identity();在 sql server 中。

在oracle中你需要使用一个序列并自己在表中插入值。

Informix

因此,在您的代码中,您将必须知道当前配置了哪个数据库以使用所需的代码。

另一种选择是让存储过程执行插入,获取 ID 并返回给您。然后您不需要对代码进行任何更改,代码调用一个返回 ID 的存储过程,但是您对于每个数据库引擎都有不同版本的存储过程,每个都具有相同的名称,并将它们包含在您的脚本中创建您的数据库。

【讨论】:

    【解决方案2】:

    假设数据库是一个 SQLServer 数据库,你所要做的就是:

     SELECT SCOPE_IDENTITY();
    

    另外,不要使用:

     SELECT @@IDENTITY;
    

    这是邪恶的。好的,这并不是真正的邪恶,但如果您有触发器或其他任何会在您的数据库中插入另一条记录的东西,它可能不会返回您正在寻找的 ID。

    【讨论】:

    • brass 的目标是 3 个具有相同代码的 db 引擎。这仅适用于 SQL Server。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多