2017-06-28 4 views
0

J'ai une application C# qui utilise MySQL pour insérer des données dans une base de données. L'application insère parfois des données déjà présentes dans la base de données. Quel est le meilleur moyen de détecter s'il y a eu des erreurs dans ce cas?Comment détecter les erreurs SQL INSERT pour les données déjà dans la base de données?

Je comprends que ExecuteNonQuery() renvoie le nombre de lignes affectées, donc si cela est supérieur à 0, cela peut être interprété comme une transaction réussie. Toutefois, si les données sont déjà dans la base de données, les lignes affectées sont 0, mais cela peut également être considéré comme une transaction réussie puisque les données sont dans la base de données.

string sql = @"INSERT my_table (field1, field2) VALUES (@value1, @value2);" 

MySqlCommand cmd = new MySqlCommand(sql, connection); 

// Execute 
int rowsAffected = cmd.ExecuteNonQuery(); 
if (rowsAffected > 0) 
{ 
    // Query was successful 
} 
else 
{ 
    // Query *may* have been successful 
} 
+0

Pas nécessairement une réponse à la question, mais peut-être une solution. Avez-vous envisagé d'utiliser un «UPSERT» à la place? https://dev.mysql.com/doc/refman/5.7/fr/insert-on-duplicate.html Cela pourrait vous retourner un nombre plus utile –

+1

Utilisez l'instruction Select pour voir si l'enregistrement existe déjà dans le tableau, puis effectuez l'insertion, de cette façon, vous pouvez même éviter la vérification d'erreur. Ceci est juste une alternative pour votre cas. – Sujith

Répondre

2

En supposant que les données de votre base de données échoue à cause d'une clé en double, alors vous devrez attraper l'exception qui sera lancée par la commande SQL

Ensuite, vous pouvez rechercher le numéro d'erreur déterminer ce qui a causé l'erreur. Pour une clé en double, je crois que le code d'erreur est 1062.

try 
{ 
    string sql = @"INSERT my_table (field1, field2) VALUES (@value1, @value2);" 
    MySqlCommand cmd = new MySqlCommand(sql, connection); 

    int rowsAffected = cmd.ExecuteNonQuery(); 
    //Do something post insert 

} 
catch(MySqlException ex) 
{ 
    if (ex.Number == 1062) 
    { 
     //Duplicate key error. Data already exists now do something. 
    } 
} 

liste complète des codes d'erreur MySQL sont ici: https://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html

À la suite de ce que Sean dit ci-dessus, vous en fonction de votre cas d'utilisation que vous pourriez voulez juste écraser la clé de toute façon (upsert) ou ignorer l'erreur.

INSERT IGNORE

Cette commande indique Mysql d'insérer le disque si possible. Mais si un doublon existe alors ne pas insérer mais ne jetez pas une erreur (supprimer ou ignorer l'erreur)

string sql = @"INSERT IGNORE my_table (field1, field2) VALUES (@value1, @value2);" 

REPLACE

Cette commande indique MySql d'insérer le disque, si nécessaire puis remplacer un enregistrement existant par les nouvelles données (un Upsert).

string sql = @"REPLACE my_table (field1, field2) VALUES (@value1, @value2);" 

Cet article explique les concepts et les idées autour de cela et va plus en profondeur: https://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm