2012-03-15 198 views
0

我有一個使用Oracle數據庫的ASP.NET Web應用程序(VB.NET)。在插入時,我需要獲取插入行的標識。我正在嘗試使用RETURNING,但我一直得到返回值1。在Oracle中返回INSERT沒有返回正確的值

Dim strInsert As String = "INSERT INTO L.TRANSACTIONS (LOCATION_KEY, TRANS_CREATOR, TRANS_EMAIL, TRANS_PHONE) VALUES (:location_key, :trans_creator, :trans_email, :trans_phone) RETURNING TRANS_ID INTO :ukey" 

Try 
    If oConn.State <> ConnectionState.Open Then 
     oConn.Open() 
    End If 

    Dim oCmnd As New OracleCommand(strInsert, oConn) 
    oCmnd.Parameters.Add("location_key", Session.Item("location").ToString.Trim()) 
    oCmnd.Parameters.Add("trans_creator", Session.Item("userID").ToString.Trim()) 
    oCmnd.Parameters.Add("trans_email", Session.Item("mail").ToString.Trim()) 
    oCmnd.Parameters.Add("trans_phone", Session.Item("phone").ToString.Trim()) 
    oCmnd.Parameters.Add("ukey", Oracle.DataAccess.Client.OracleDbType.Varchar2, System.Data.ParameterDirection.ReturnValue) 

    Dim strUkey As String = oCmnd.ExecuteNonQuery() 

當我運行應用程序時,記錄被插入,TRANS_ID遞增,但返回的值始終爲「1」。

+1

它是一個數據類型的問題?嘗試使ukey int int – jle 2012-03-15 19:51:14

+0

@jle - 編號改變爲一個int16,它仍然返回值爲1.我想知道它是否返回一個真正的布爾值作爲一個int? – monkeypushbutton 2012-03-15 20:04:17

回答

2

你分配的ExecuteNonQuery結果的變量,而不是讓分配到的價值您創建的參數。我相信你想把最後一行改成這樣(未經測試):

oCmnd.ExecuteNonQuery 
Dim strUkey As String = oCmnd.Parameters.GetParameter("ukey").Value 
+0

上面這個和jle的評論的組合。我試着改變VB的ukey變量的數據類型,而不是參數。所以一旦它是正確的Oracle數據類型,我就可以獲得我需要的值。 – monkeypushbutton 2012-03-15 20:33:28

2

這是因爲ExecuteNonQuery將返回受影響的行數:

對於UPDATE,INSERT和DELETE語句,返回值是 數受命令行。對於CREATE TABLE和DROP TABLE語句,返回值爲0.對於所有其他類型的 語句,返回值爲-1。

你可以看到,存在另一個問題,涵蓋了實踐做:

Best practices: .NET: How to return PK against an oracle database?

+0

我在發佈之前閱讀過這個問題,但沒有說明如何使用OracleCommand獲取返回值。感謝ExecuteNonQuery的領導。對於SQL Server(我更熟悉),我只是使用帶有SCOPE_IDENTITY的ExecuteScalar,但在這種情況下ExecuteScalar返回Nothing。 – monkeypushbutton 2012-03-15 20:12:25

+0

在這個問題中,他們說使用存儲過程返回插入記錄的ID。 – 2012-03-15 20:26:44