2008-12-31 7 views
0

J'espère que quelqu'un pourra m'aider avec ce problème.C# MySqlCommand Problème de clés étrangères multiples Drop

J'ai une petite application pour 'patcher' notre base de données car nous devons augmenter la fonctionnalité et corriger les bogues. Il lit dans les patches qui sont juste des fichiers avec des instructions SQL et fait un peu de ménage interne, interrogeant la base de données et appliquant les correctifs qui n'ont pas été appliqués. En tout cas, c'est la solution que nous avons, bonne ou mauvaise, et ça a plutôt bien fonctionné ... jusqu'à maintenant.

J'ai trouvé nécessaire de supprimer les contraintes de clé étrangère existantes sur un certain nombre de tables et de les remplacer par une clause ON DELETE CASCADE au lieu de ON DELETE RESTRICT qu'elles ont actuellement. L'idée étant que la suppression du PK sur la table que ces autres tables référencent entraînera le nettoyage de tous les autres.

Essentiellement le fichier patch est ce qui suit dans le:

ALTER TABLE `mydb`.`table2` DROP FOREIGN KEY `fk_table2_id`; 
ALTER TABLE `mydb`.`table3` DROP FOREIGN KEY `fk_table3_id`; 
ALTER TABLE `mydb`.`table4` DROP FOREIGN KEY `fk_table4_id`; 

et associé

ALTER TABLE `mydb`.`table2` ADD CONSTRAINT `fk_table2_id` FOREIGN KEY `fk_table_id` (`fk_the_id`) REFERENCES `mydb` (`id`) 
ON DELETE CASCADE 
ON UPDATE RESTRICT; 

etc... 

Du côté C#, quand je passe cette chaîne (les instructions SQL trouvées dans le fichier patch) comme suit:

MySqlCommand myCommand = new MySqlCommand(thePatch); 
myCommand.Connection = connection; 
myCommand.ExecuteNonQuery(); 

Je reçois le message d'erreur suivant:

Erreur sur changement de nom de '\ mydb \ table2' . À (errno: 152)' \ mydb # sql2-6a8-3f. »

Je reçois quand seulement j'ai deux de ces DROP FOREIGN KEY lignes dans la chaîne.

Je me suis assuré que les clés listées sur les lignes DROP sont les clés et non les noms des colonnes et tout le reste semble (pour moi au moins) être OK.

J'ai inclus plusieurs instructions SQL dans un seul MySqlCommand et je n'ai eu aucun problème, donc je suis un peu frustré.

Je peux prendre le même fichier et le rediriger vers mysql.exe à partir de la ligne de commande et cela fonctionne très bien, donc cela semble être une différence dans la façon dont les instructions sont gérées.

Est-ce que quelqu'un a des idées sur celui-ci?

Merci, Matt

Répondre

0

je ne sais pas la réponse complète, mais cela peut aider à résoudre un peu plus. Lorsque vous modifiez une table MySQL utilise les étapes suivantes: 1) CREATE TABLE newTableName avec les nouvelles spécifications 2) SELECT * FROM oldTableName EN newTableName 3) Renommer oldTableName à certains intermediateTableName 4) renommer newTableName à OldTableName 5) DROP TABLE intermediateTableName

L'erreur que vous mentionnez semble échouer l'étape 3 ici. Vous pouvez vérifier les autorisations de fichiers. Au-delà je m'en remettrai à ceux qui ont une meilleure connaissance des internes de MySQL.

Questions connexes