2010-04-21 70 views
2

我有使用强类型DataSet如下将数据插入我的SQL数据库的一些VB.net代码:如何获取我刚刚插入到.net类型数据集中的行的主键?

暗淡usersTa作为新authorizedUsersTableAdapters.Authorized_UsersTableAdapter usersTa.Connection =新Data.SqlClient.SqlConnection(MY_CONNECTION_STRING) usersTa.Insert(first_name,last_name)

在数据库中,有一个主键,通过它我可以识别行。当我运行这段代码时,找出刚刚插入的行的主键的最有效方法是什么?

回答

3

我假设你正在执行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) 
+0

当我将类型化的数据集对象添加到我的项目中时,设计师会生成实际插入数据的代码。 我已经被指示避免在我的代码中有SQL语句。 – 2010-04-21 14:09:48

+2

我不想告诉你,但设计者正在编写SQL语句在你的代码中执行。如果你没有问题,那么你不应该修改设计器为你生成的SQL。无论哪种方式,某处的SQL都必须执行。 – Jeremy 2010-04-21 14:14:35

+1

然后,我会按照@Oded答案并将SCOPE_IDENTITY包装在StoredProc中。如果你不想这样做,你必须要求最近插入的行效率低下。在某些情况下,自动生成消除了灵活性 – 2010-04-21 14:15:05

1

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

请参阅this SO问题和答案(获取插入行的身份的最佳方式?)处理SQL的这一面。

+0

这将是一个解决方案,如果我这样做的存储过程。不过,我正在尝试使用Visual Studio设计器设置的类型化数据集来完成此操作。 – 2010-04-21 14:10:29

0

你需要告诉你的表的表适配器更新/插入操作之后刷新 数据表。 这是你如何做到的。 >默认选择查询 - - 的的TableAdapter

  1. 打开属性> Advnaced选项。并检查选项刷新数据表。现在保存适配器。现在,当您调用表适配器上的更新时,数据表将在更新/插入操作后更新[刷新],并将反映数据库表中的最新值。 如果主键或任何色彩设置为自动递增,则数据表将在最近更新后具有最新值。

  2. 现在你可以调用更新为TableAdapterObj.Update(ds.dataTable);

  3. 从DataTable(ds.dataTable)颜色中读取最新值,并在更新/插入之前将相应的值分配到子表中。这将按照你想要的方式工作。

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

1

有一个图书馆,Kailua - The forgotten methods in the ADO.NET API.,这并不前五名供应商提供这个和额外的元数据。此信息是供应商特定的。

将您的连接换成net.windward.utils.ado.WrCommand并使用ExecuteInsert函数。

+1

您链接的图书馆是否回答OP的问题,如果有,如何? – 2011-02-21 19:49:26

+0

是的。他想要一种方法来获得刚刚插入的主键的价值,凯鲁阿有一个电话给他提供这些信息。他可以使用该库,也可以阅读Sql Server驱动程序的代码,以查看它是如何专门为Sql Server完成的。 – 2011-02-22 18:02:06

相关问题