2010-04-21 35 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

相關問題