2012-03-15 199 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