【问题标题】:How do I get the primary key of the row I just inserted into a typed dataset in .net?如何获取我刚刚插入到 .net 中的类型化数据集中的行的主键?
【发布时间】:2010-04-21 13:46:39
【问题描述】:

我有一些 VB.net 代码,它使用如下类型的数据集将数据插入到我的 SQL 数据库中:

dim usersTa As New authorizedUsersTableAdapters.Authorized_UsersTableAdapter usersTa.Connection = 新 Data.SqlClient.SqlConnection(MY_CONNECTION_STRING) usersTa.Insert(first_name, last_name)

在数据库中,有一个主键用于识别行。运行此代码时找出我刚刚插入的行的主键的最有效方法是什么?

【问题讨论】:

    标签: .net sql vb.net ado.net strongly-typed-dataset


    【解决方案1】:

    我假设您正在Authorized_UsersTableAdapter.Insert() 方法中执行某种 SQL。

    为了返回你使用SCOPE_IDENTITY()的标识符。

    如果您的标识符是 Int 的示例。

    Dim conn As SqlConnection = ...
    Dim cmd As New SqlCommand(INSERT INTO T (Name) VALUES('Test')" & ChrW(13) & ChrW(10) & "SELECT SCOPE_IDENTITY() As TheId", conn)
    Dim tId As Integer = CInt(cmd.ExecuteScalar)
    

    【讨论】:

    • 当我将类型化的数据集对象添加到我的项目时,设计器会生成实际插入数据的代码。我被指示避免在我的代码中包含 SQL 语句。
    • 我不想告诉你,但设计者正在编写要在你的代码中执行的 SQL 语句。如果您对此没有任何问题,那么修改设计器为您生成的 SQL 应该不会有任何问题。无论哪种方式,都必须在某处执行一些 SQL。
    • 然后我会按照@Oded 回答并将 SCOPE_IDENTITY 包装在 StoredProc 中。如果您不想这样做,则必须要求最近插入的行效率低下。在某些情况下,自动生成会消除灵活性。
    • @Jermeny,我完全同意。我不喜欢在某处“隐藏”的自动生成代码。我宁愿将 SQL 打包到某个业务层中。
    • Here's 一个 MS 博客条目,建议在查询设计器中添加另一个附加了 SELECT @@IDENTITY 的插入查询。
    【解决方案2】:

    如果您使用存储过程,则可以将值作为存储过程的返回值。

    请参阅this SO 问题和答案(获取插入行标识的最佳方法?)处理 SQL 方面的问题。

    【讨论】:

    • 如果我使用存储过程执行此操作,那将是一个解决方案。但是,我正在尝试使用我使用 Visual Studio 设计器设置的类型化数据集来执行此操作。
    【解决方案3】:

    有一个库,Kailua - The forgotten methods in the ADO.NET API. ,确实为排名前 5 的供应商提供了此元数据和其他元数据。此信息是特定于供应商的。

    将您的连接包装在net.windward.utils.ado.WrCommand 中并使用ExecuteInsert 函数。

    【讨论】:

    • 您链接的库是否回答了 OP 的问题,如果回答了,如何回答?
    • 是的。他想要一种方法来获取刚刚插入的主键的值,而 Kailua 打电话给他该信息。他可以使用该库或阅读 Sql Server 驱动程序的代码,看看它是如何专门为 Sql Server 完成的。
    【解决方案4】:

    您需要告诉表格的表格适配器刷新 更新/插入操作后的数据表。 您可以这样做。

    1. 打开TableAdapter的属性->默认选择查询->高级选项。并勾选刷新数据表选项。现在保存适配器。现在,当您在 table-adapter 上调用 update 时,数据表将在更新/插入操作之后更新 [刷新],并将反映数据库表中的最新值。 如果主键或任何列设置为自动递增,则数据表将具有最近更新后的最新值。

    2. 现在您可以将更新称为 TableAdapterObj.Update(ds.dataTable);

    3. 从 DataTable(ds.dataTable) 列中读取最新值,并在更新/插入之前将各自的值分配到子表中。这将完全按照您想要的方式工作。

    alt text http://ruchitsurati.net/files/tds1.png

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2013-06-18
      • 2014-08-23
      相关资源
      最近更新 更多