【问题标题】:OracleCommand Update does not commit changesOracleCommand 更新不提交更改
【发布时间】:2010-10-11 16:03:54
【问题描述】:

我正在使用以下代码更新 oracle 中的表。它执行但更新不提交。如果我使用 Oracle SQL Developer 运行查询,它工作正常。我错过了什么? SELECT 语句按预期工作。

`Dim BillOfLadingNumber As String = txtBillOfLadingNumber.Text.Trim

    Dim TrailerNumber As String = txtTrailerNumber.Text.Trim
    Dim CarrierCode As String = txtCarrierCode.Text.Trim
   Dim TransportationMethod As String = txtTransportationMethod.Text.Trim 
   Dim OracleCommand As New OracleCommand()
    With OracleCommand
        .Connection = OracleConnection
        .CommandType = CommandType.Text
        .CommandText = "UPDATE XXF_ASN_HEADERS SET BILL_OF_LADING_NUMBER ='" + BillOfLadingNumber + "',TRAILER_NUMBER ='" + TrailerNumber + "',CARRIER_CODE ='" + CarrierCode + "',TRANSPORTATION_METHOD ='" + TransportationMethod + "' WHERE HEADERID ='" + Request.QueryString("HeaderId") + "'"
    End With

    OracleConnection.Open()
    Dim result As Integer = OracleCommand.ExecuteNonQuery()
    OracleConnection.Close()

    If result = 1 Then Response.Redirect("default.aspx")`

【问题讨论】:

  • 不是解决方案的一部分,但您应该真正使用参数
  • 是否存在未提交的事务范围?
  • 是的,OracleTransaction 对象的使用是主要关键。谢谢大家。

标签: c# oraclecommand


【解决方案1】:

感谢大家为我指出正确的方向。这是最终的工作代码。诀窍是使用 OracleTransaction,下面的代码就像一个魅力。接下来是参数使用。更多信息可以找到here

            Using dbConnection As New OracleConnection(OracleConnectionString)

                'Open the connection
                dbConnection.Open()

                Dim dbCommand As OracleCommand = dbConnection.CreateCommand()
                Dim dbTransaction As OracleTransaction

                'Start a local transaction 
                dbTransaction = dbConnection.BeginTransaction(IsolationLevel.ReadCommitted)
                'Assign transaction object for a pending local transaction
                dbCommand.Transaction = dbTransaction

                Try
                    dbCommand.CommandType = CommandType.Text
                    dbCommand.CommandText = "UPDATE XXF_ASN_HEADERS SET BILL_OF_LADING_NUMBER ='" + BillOfLadingNumber + "', TRAILER_NUMBER ='" + TrailerNumber + "', CARRIER_CODE ='" + CarrierCode + "', TRANSPORTATION_METHOD ='" + TransportationMethod + "' WHERE HEADERID ='" + Request.QueryString("HeaderId") + "'"
                    dbCommand.ExecuteScalar()
                    dbTransaction.Commit()
                    Response.Redirect("default.aspx")
                Catch ex As OracleException
                    'Rollback the transaction
                    dbTransaction.Rollback()
                    'display error details
                    lblUpdateQuery.Text = dbCommand.CommandText
                    lblDebug.Text = ex.Message.ToString
                End Try

            End Using

【讨论】:

    【解决方案2】:

    我正在处理的项目也使用 OracleCommand。最大的不同是我们所有的数据库调用都转到存储过程,而不是直接更改数据库的动态 sql。最有可能的是,您需要将更新语句包装在“BEGIN”和“END”块中,并可能添加“COMMIT;”声明。

    不过要小心。如果您将回车和换行符放入 CommandText,则至少有一个版本的 Oracle .NET 库将失败。只需用分号分隔即可。

    【讨论】:

    • 第二种选择是使用存储过程,但我试图摆脱 SP 以消除此应用程序维护的复杂性(将其交给初级开发人员)。这不是一个庞大的应用程序,因此进行一些 N 层部署将是矫枉过正,但您确实帮助我解决了我打开的另一个问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多