Éditer les problèmes D'enregistrement dans Access / SQL (écrire le conflit)
un problème est apparu après qu'un DB SQL que j'ai utilisé ait été migré vers un nouveau serveur. Maintenant, lorsque vous essayez d'éditer un enregistrement dans Access( forme ou table), il est dit:WRITE CONFLICT: This record has been changed by another user since you started editing it...
y a t évidentes raisons pour cela. Il n'y a personne d'autre qui utilise le serveur, j'ai désactivé tous les déclencheurs sur la Table. J'ai juste trouvé que C'est quelque chose à faire avec les NULLs car les enregistrements qui n'en ont pas sont ok, mais certaines lignes qui ont des NULLs ne le sont pas. Cela pourrait-il être lié aux index? Si elle est pertinente, j'ai récemment commencé à télécharger en masse tous les jours, plutôt que de le faire un à la fois en utilisant INSERT INTO de L'accès.
11 réponses
une raison pourrait être que le document en question a été ouvert sous une forme que vous éditez. Si vous modifiez l'enregistrement par programmation au cours de votre session d'édition, puis essayez de fermer le formulaire (et donc essayer de l'enregistrer), l'accès dit que le dossier a été modifié par quelqu'un d'autre.
Enregistrer le formulaire avant de modifier l'enregistrement par programmation.
Dans la forme:
'This saves the form's current record
Me.Dirty = False
'Now, make changes to the record programmatically
mise à jour 1
assurez-vous que la table SQL-Server a une clé primaire ainsi qu'une colonne timestamp.
la colonne timestamp aide à déterminer si le document a été modifié depuis sa dernière sélection. L'accès fait cela en inspectant tous les champs, si aucun horodatage n'est disponible. Peut-être que cela ne fonctionne pas bien avec les entrées nulles s'il n'y a pas de colonne timestamp (voir ma mise à jour 2).
le timestamp stocke en fait un numéro de version de ligne et non un temps.
n'oubliez pas de rafraîchir le lien de la table dans access après avoir ajouté une colonne timestamp, sinon Access ne le verra pas. (Note: L'Assistant Upsizing de Microsoft crée des colonnes de timestamp lors de la conversion des tables D'accès en tables SQL-Server.)
UPDATE 2
selon @AlbertD.Kallal cela pourrait être une valeur null bits problème décrit ici: KB280730. Si vous utilisez des champs de bits, définissez leur valeur par défaut à 0
et remplacer tous les NULLs entrés avant par 0
. J'utilise habituellement un BIT DEFAULT 0 NOT NULL
pour les champs Booléens comme il se rapproche le plus de l'idée d'un Booléen.
L'article de KB dit d'utiliser un *.adp au lieu d'un *.mdb; cependant, Microsoft a abandonné le support pour Access Data Projects (ADP) dans Access 2013.
Eu ce problème, de même que l'affiche originale. Même sur Modifier directement en utilisant aucun formulaire. Le problème est sur les champs de bits, si votre champ est Null, il convertit Null à 0 lorsque vous accédez à l'enregistrement, puis vous faites des changements qui cette fois est le 2ème changement. Donc les 2 changent les conflits. J'ai suivi la suggestion D'Olivier:
" assurez-vous que la table a une touche primaire ainsi qu'un colonne timestamp."
et ça a résolu le problème.
j'ai vu une situation similaire avec MS Access 2003 (et avant) lorsqu'il était lié à MS SQL Sever 2000 (et avant). Dans mon cas, j'ai trouvé que le problème à être les champs de bits dans les tables de base de données de serveur de MS SQL - les champs de bits n'autorisent pas les valeurs nulles. Quand j'ajouterais un enregistrement à une table liée via MS Access 2003 la fenêtre de la base de données retournerait une erreur à moins que je ne mette spécifiquement le champ bit à True ou False. Pour remédier à cela, j'ai changé les datatables DE MS SQL Server de sorte que n'importe quel champ de bits par défaut à 0 valeur ou 1. Une fois que j'ai fait cela, j'ai pu ajouter/éditer des données à la table liée via MS Access.
j'ai trouvé le problème dû au conflit entre les champs de bits Jet/Access boolean et SQL Server.
décrit ici sous le pitfall #4 https://blogs.office.com/2012/02/17/five-common-pitfalls-when-upgrading-access-to-sql-server/
j'ai écrit un script SQL pour modifier tous les champs de bits à NOT NULL et fournir un - zéro par défaut dans mon cas.
il suffit de l'exécuter dans SQL Server Management Studio et de coller les résultats dans une nouvelle fenêtre de requête et exécuter eux - sa pas la peine de mettre cela dans un curseur et de l'exécuter.
SELECT
'UPDATE [' + o.name + '] SET [' + c.name + '] = ISNULL([' + c.name + '], 0);' +
'ALTER TABLE [' + o.name + '] ALTER COLUMN [' + c.name + '] BIT NOT NULL;' +
'ALTER TABLE [' + o.name + '] ADD CONSTRAINT [DF_' + o.name + '_' + c.name + '] DEFAULT ((0)) FOR [' + c.name + ']'
FROM
sys.columns c
INNER JOIN sys.objects o
ON o.object_id = c.object_id
WHERE
c.system_type_id = 104
AND o.is_ms_shipped = 0;
ceci est un bug avec Microsoft
Pour contourner ce problème, utilisez l'une des méthodes suivantes:
mettre à jour le formulaire qui est basé sur la vue multi-tables Sur la première occurrence du message d'erreur qui est mentionné dans la section "Symptômes", vous devez cliquer soit Copier dans le bloc-notes ou Changement de Drop dans la boîte de dialogue Write Conflict. Pour éviter la répétition de l' occurrence du message d'erreur mentionné dans le "Symptômes"
l'article, vous devez mettre à jour le jeu d'enregistrements dans le formulaire avant de le modifier
à nouveau le même enregistrement. Note Pour mettre à jour le formulaire dans accès 2003 ou dans accès 2002, cliquez rafraîchir dans le menu dossiers. Pour mettre à jour le formulaire dans accès 2007, cliquez rafraîchir tout dans le groupe des notices de l'onglet Accueil.utilisez un formulaire principal avec un sous-formulaire lié Pour éviter la répétition du message d'erreur mentionné dans le Section "symptômes", vous pouvez utiliser un formulaire principal avec un
sous-formulaire lié pour entrer des données dans les tableaux connexes. Vous pouvez entrer
les enregistrements dans les deux tableaux à partir d'un seul endroit sans utiliser un formulaire qui est basé sur la vue multi-tables. Pour créer un formulaire principal et un sous-formulaire, procédez comme suit:Créer un nouveau formulaire basé sur la table liée (enfant) qui est utilisé dans la vue multi-table. Inclure les champs requis sur la forme. Enregistrez le formulaire, puis fermez le formulaire. Créer un nouveau formulaire basé sur la table principale qui est utilisée dans la vue multi-table. Incluez les champs requis sur le
forme. Dans la fenêtre Base de données, ajouter le formulaire que vous avez enregistré à l'étape 2 du formulaire principal.cela crée une sous-forme. Définissez la propriété des Champs enfant de lien et la propriété des Champs maître de lien du sous-formulaire au nom du ou des champs qui sont
utilisé pour relier la table.
méthodes de travail autour prises de support de microsoft
j'ai expérimenté les deux causes décrites ci-dessus: changer directement les données dans une table qui est actuellement liée à un formulaire et avoir un champ de type 'bit' dans SQL Server qui n'a pas la valeur par défaut fixée à '0' (zéro).
la seule façon dont j'ai pu contourner ce dernier problème est d'ajouter la valeur par défaut de zéro au champ bit et d'exécuter une requête de mise à jour pour définir toutes les valeurs courantes à zéro.
pour contourner la première erreur, j'ai dû être inventif. Parfois, je peux changer l'ordre des instructions VBA et déplacer rafraîchir ou Requery à un endroit différent, empêchant ainsi le message d'erreur. Dans la plupart des cas, cependant, ce que je fais est DIM une variable String dans le sous-programme où j'appelle la mise à jour directe de la table. Avant d'appeler la mise à jour, j'ai mis cette variable String à la valeur de Recordsource derrière la forme liée, capturant ainsi l'instruction SQL exacte utilisée à l'époque. Ensuite, J'ai placé la source du formulaire à vide. string ( "" ) afin de le déconnecter des données. Ensuite, j'effectue la mise à jour des données. Ensuite, j'ai défini Recordsource du formulaire à la valeur sauvegardée dans la variable String, en rétablissant la liaison et en lui permettant de récupérer la ou les nouvelles valeurs dans la table. S'il y a un ou plusieurs sous-formulaires contenus dans ce formulaire, alors les champs "lien" doivent être traités de la même manière que la source des enregistrements. Lorsque la Recordsource est définie à une chaîne vide, vous pouvez voir #Name dans les champs now-unbound. Ce que je fais, c'est simplement mettre la propriété Visible à False au niveau le plus élevé possible (section Détail, sous-forme, etc.) pendant le temps où Recordsource est vide, cachant les valeurs de #Name à l'utilisateur. Définir la source de Recordsource à une chaîne vide est ma solution de go-to Quand un changement de codage ne peut pas être trouvé. Je me demande, cependant, si mes compétences en design font défaut et s'il y a un moyen d'éviter complètement le problème?
une dernière réflexion pour répondre au message d'erreur: Au lieu d'appeler une routine pour mettre à jour directement les données dans la table de table, je trouve un moyen de mettre à jour les données via le formulaire à la place, en ajoutant un contrôle lié au formulaire et en mettant à jour les données dans cela de sorte que les données de formulaire et les données de table ne deviennent pas hors de la synchronisation.
afin de surmonter ce problème. J'ai créé VBA pour changer un autre champ dans la même rangée. J'ai donc créé un champ distinct qui ajoute 1 au contenu lorsque j'essaie de fermer le formulaire. Ceci a résolu le problème.
j'ai traité de ce problème avec les tables MS Access liées aux tables MS SQL plusieurs fois. La réponse de l'affiche originale a été extrêmement utile et a été la source d'une grande partie de mes problèmes.
j'ai aussi rencontré ce problème lorsque j'ai accidentellement ajouté un peu de champ avec un espace dans le nom de champ... ouais....
j'ai lancé alter TABLE tablename ajouter [fieldname ] bit par défaut 0. la solution que j'ai trouvée était de laisser tomber ce champ et de ne pas avoir d'espace dans le nom.
j'ai eu ce problème et j'ai réalisé qu'il était causé par l'ajout d'un nouveau champ de bits à une table existante. J'ai supprimé le nouveau champ et tout rentre dans fonctionne bien.
si vous utilisez des tables liées, assurez-vous de les avoir mises à jour et réessayez avant de faire quoi que ce soit d'autre.
je pensais que je les avais mis à jour mais je ne l'avais pas fait, il s'avère que quelqu'un avait mis à jour la validation du formulaire et les tables SQL pour autoriser 150 caractères, mais n'avait pas rafraîchi la table liée donc l'accès n'a vu que 50 caractères permis - Boom écrire conflit
Je ne suis pas sûr que ce soit l'erreur la plus appropriée pour le scénario, mais bon, la plupart des problèmes intéressants ne sont jamais signalés de manière appropriée dans n'importe quel logiciel microsoft!
je recevais le même message d'erreur. La colonne Id dans la table de base de données a été définie à BigInt, en la changeant pour Int résolu le problème.