我有一个使用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”。
答案 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