2010-10-11 3 views
1

J'utilise le code suivant pour mettre à jour une table dans Oracle. Il s'exécute mais la mise à jour ne s'engage pas. Si j'exécute la requête avec Oracle SQL Developer, cela fonctionne correctement. Qu'est-ce que je rate? Les instructions SELECT fonctionnent comme prévu.OracleCommand Update ne valide pas les modifications

`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")` 
+5

pas partie de la solution, mais vous devriez vraiment utiliser les paramètres –

+0

Y at-il une transaction portée qui ne sont pas commis? –

+0

Oui, l'utilisation de l'objet OracleTransaction était la clé principale. Merci à tous. –

Répondre

1

Merci à tous pour m'avoir indiqué dans la bonne direction. C'est le code de travail final. L'astuce était d'utiliser OracleTransaction, le code ci-dessous fonctionne comme un charme. L'utilisation des paramètres est la suivante. Plus d'informations peuvent être trouvées 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 
0

Le projet que je travaille sur les utilisations OracleCommand aussi bien. La grande différence est que tous nos appels de base de données vont aux procédures stockées plutôt que SQL dynamique qui change directement la base de données. Très probablement, vous aurez besoin d'envelopper l'instruction de mise à jour dans un bloc "BEGIN" et "END", et probablement ajouter un "COMMIT"; déclaration.

Attention cependant. Au moins une version de la bibliothèque .NET pour Oracle échouera si vous placez des retours chariot et des sauts de ligne dans CommandText. Juste séparer les choses avec les points-virgules.

+0

La deuxième option consistait à utiliser des procédures stockées, mais j'essaie d'échapper aux SP pour éliminer la complexité dans la maintenance de cette application (je le remettrai aux développeurs juniors). Ce n'est pas une application énorme, donc faire un déploiement de N-tier serait exagéré, mais vous m'avez aidé à résoudre un autre problème que j'avais ouvert. Merci. –

Questions connexes