2010-10-27 3 views
4

J'ai du code qui réorganise certains éléments sur un formulaire, mais une seule requête SQL. Tous mes tableaux ne sont pas verrouillées avant l'exécution de code, mais pour une raison quelconque, je reçois une erreur lors de l'exécution:table verrouillée ou en cours d'utilisation lors de l'appel RunSQL

DoCmd.RunSQL ("Select * Into MasterTable From Year07 Where 'ClassName' = '7A'") 

Erreur:

The database engine could not lock table because it is already in use by another person or process. (Error 3211) To complete this operation, a table currently in use by another user must be locked. Wait for the other user to finish working with the table, and then try the operation again.

Toutes les idées ce que je peux faire pour arrêter la table étant verrouillée ?

Répondre

4

Est-ce que MasterTable est inclus dans la source d'enregistrement de votre formulaire? Si c'est le cas, vous ne pouvez pas le remplacer ou modifier sa structure tant que le formulaire est ouvert. En dehors du problème de verrouillage de table, une erreur logique se produit dans l'instruction SELECT.

Where 'ClassName' = '7A' 

La chaîne, ClassName, ne sera jamais égale à la chaîne, 7A. Par conséquent, votre SELECT ne peut jamais renvoyer aucun enregistrement. Si ClassName est le nom d'un champ dans votre table Year07, ignorez les citations qui entourent le nom du champ.

Where ClassName = '7A' 
+0

Oui, le MasterTable est dans la source d'enregistrement du formulaire Savez-vous comment je peux contourner ce problème sans avoir à fermer le formulaire, effectuer l'action et ensuite rouvrir le formulaire? J'ai également changé le problème 'ClassName', bien que dans – Tim

+0

Ma meilleure estimation est que vous devriez remplacer 'Select * From Year07 où ClassName = '7A'' partout où MasterTable apparaît dans la Source d'enregistrement de votre formulaire. IOW, vous n'avez peut-être même pas besoin de MasterTable en tant que table réelle. Mais ce n'est que ma conjecture. Vous pouvez avoir une meilleure idée si vous éditez votre question pour nous montrer la source de l'enregistrement. – HansUp

+0

L'idée est d'avoir de nombreuses tables contenant des données différentes mais de n'en afficher qu'une seule à la fois (choisie par une combo). Lorsque la zone de liste déroulante est modifiée, les valeurs dans la table principale changent pour afficher uniquement ce qui est nécessaire. Je n'étais pas sûr à l'accès comment le faire correctement, mais je sais maintenant. Merci! :) – Tim

0

J'ai vu cela lorsque vous rouvrez une base de données après la panne d'Access. Typiquement pour moi, un redémarrage a résolu cela.

+0

J'ai essayé de redémarrer, mais le problème n'a pas disparu :( – Tim

0

Quelle version de MSAccess? Vous n'êtes pas sûr des nouveautés, mais pour Access 2003 et les versions précédentes, si vous étiez sûr que personne ne se trouvait dans la base de données, vous pouvez effacer les verrous après un plantage en supprimant le fichier .ldb.

+0

C'est l'accès 2007. J'ai essayé supprimé le .ldb mais dès que j'ouvre l'original .accdb à nouveau je reçois le même problème – Tim

3

Je devine, mais si vous utilisez un formulaire qui est lié à MasterTable, vous ne pouvez pas exécuter une requête pour le remplacer par un nouveau MasterTable pendant que vous l'avez ouvert sous la forme .

Je suggère de vous débarrasser de la requête MakeTable (SELECT INTO) et d'utiliser à la place une requête append simple (INSERT). Cependant, vous devrez nettoyer les anciennes données avant d'ajouter le nouveau. Fondamentalement, une requête MakeTable est, à mon avis, quelque chose qui n'appartient pas à une application de production, et tout processus que vous avez automatisé avec une requête MakeTable doit être remplacé à la place par une table temporaire persistante qui est effacée avant les nouvelles données y sont ajoutées.

+0

+1 "une requête MakeTable est, à mon avis, quelque chose qui n'appartient pas à une application de production" – onedaywhen

Questions connexes