2010-04-20 8 views
3

J'ai une instruction INSERT à plusieurs lignes (environ 300 ensembles de valeurs) que je voudrais valider dans la base de données MySQL d'une manière tout ou rien.Annulation d'une transaction avec MySQL Connector dans VB.net

insert into table VALUES 
(1, 2, 3), 
(4, 5, 6), 
(7, 8, 9); 

Dans certains cas, un ensemble de valeurs dans la commande ne répond pas aux critères de la table (clé dupliquée, par exemple). Quand cela arrive, je ne veux pas que les ensembles précédents soient ajoutés à la base de données. J'ai implémenté ceci avec le code suivant, cependant, ma commande rollback ne semble pas faire de différence. Je l'ai utilisé cette documentation: http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqltransaction.html

Dim transaction As MySqlTransaction = sqlConnection.BeginTransaction() 
sqlCommand = New MySqlCommand(insertStr, sqlConnection, transaction) 
Try 
    sqlCommand.ExecuteNonQuery() 
Catch ex As Exception 
    writeToLog("EXCEPTION: " & ex.Message & vbNewLine) 
    writeToLog("Could not execute " & sqlCmd & vbNewLine) 
    Try 
     transaction.Rollback() 
     writeToLog("All statements were rolled back." & vbNewLine) 
     Return False 
    Catch rollbackEx As Exception 
     writeToLog("EXCEPTION: " & rollbackEx.Message & vbNewLine) 
     writeToLog("All statements were not rolled back." & vbNewLine) 
     Return False 
    End Try 
End Try 
transaction.commit() 

je reçois l'exception DUPLICATE KEY lancée, aucune exception Rollback jeté, et chaque ensemble de valeurs à clé en double enregistrées dans la base. Qu'est-ce que je fais mal?

Répondre

3

Utilisez-vous des tables MyISAM (valeur par défaut)? MyISAM ne supporte pas les transactions. Utilisez les tables InnoDB si vous avez besoin de transactions.

+0

Ouais, c'était tout. C'est toujours les petites choses. Appréciez la brillance. – Jonathan

Questions connexes