在Oracle INSERT中返回并未返回正确的值

时间:2012-03-15 19:46:55

标签: asp.net vb.net oracle insert

我有一个使用Oracle数据库的ASP.NET Web应用程序(VB.NET)。在插入,我需要获取插入行的标识。我正在尝试使用RETURNING,但我一直得到1的值。

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”。

2 个答案:

答案 0 :(得分:2)

那是因为ExecuteNonQuery将返回受影响的行数:

  

对于UPDATE,INSERT和DELETE语句,返回值为   受命令影响的行数。对于CREATE TABLE和DROP   TABLE语句,返回值为0.对于所有其他类型的   语句,返回值为-1。

你可以看到存在另一个问题,涵盖了这样做的实践:

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

答案 1 :(得分:2)

您将ExecuteNonQuery的结果分配给变量,而不是将值分配给您创建的参数。我相信你想把最后一行更改为这样的(未经测试):

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