Suite

Est-il permis de mettre à jour les fonctionnalités après le relâchement du curseur de fonctionnalité ?


Dans ArcObjects, est-il permis de modifier et de mettre à jour une entité après la libération du curseur d'entité (qui a été utilisé pour récupérer l'entité) ?

C'est-à-dire, les fonctionnalités conservent-elles un lien vers le curseur par lequel elles ont été récupérées ?

// récupère une entité via un curseur d'entité de recyclage : IFeatureClass featureClass =… ; IFeatureCursor featureCursor = featureClass.Search(rien, vrai); IFeature feature = featureCursor.NextFeature(); // relâche le curseur de fonctionnalité : Marshal.FinalReleaseComObject(featureCursor); // QUESTION : la fonctionnalité peut-elle encore être modifiée et mise à jour ? fonction.Valeur(… ) =… ; feature.Store();
  • Je programme avec les versions 9.3 et 10 d'ArcGIS.
  • Est-ce que cela fait une différence que le curseur soit recyclé ou non ?

P.S. : J'ai essayé cela sous les versions 9.3 et 10 d'ArcGIS, et il semble être fonctionne bien; Cependant, cela ne signifie pas que cela sera toujours travail, ni qu'il devrait être terminé. Je n'ai trouvé aucun indice sur ce problème dans la documentation en ligne de l'API d'ESRI.


L'essentiel est de savoir si le curseur recycle ou non.

Curseurs de recyclage remettre la même instance pour chaque fonctionnalité, avec des valeurs différentes à chaque itération. C'est-à-dire qu'ils recyclent la même instance. Ceci est fait pour des gains de performances car moins d'objets sont instanciés. Cela signifie également que vous ne pouvez généralement pas conserver la référence à vos objets de géodatabase récupérés avec les curseurs de recyclage. Ainsi, les curseurs de recyclage sont ne convient pas si vous effectuez des mises à jour ultérieures des fonctionnalités.

Curseurs non recyclables, d'autre part, instanciez une instance distincte pour chaque fonctionnalité qu'ils renvoient. Vous pouvez conserver les références à vos objets dans une session d'édition et effectuer des mises à jour sur eux en appelantMagasin.

Dans votre extrait de code particulier, il n'y a pas de différence puisque vous ne récupérez qu'une seule fonctionnalité. Si vous en récupérez deux et gardez la référence à chacun d'eux, les deux références pointeraient vers le même objet (le dernier récupéré).

Voir certainement la discussion au bas de IFeatureClass.Search. Je vous recommande également de consulter la présentation de la bibliothèque Geodatabase.


Mise à jour, comme commenté ci-dessous : Les instances d'entités ne font pas référence au curseur utilisé pour les récupérer, elles ne lui sont donc en aucun cas liées. Alors oui, vous pouvez faire référence à une fonctionnalité si le curseur n'existe plus, mais (si vous ignorez le scénario spécifique avec une seule fonctionnalité récupérée), cela n'a évidemment de sens que pour les curseurs non recyclés.


Comme @petr-krebs l'a mentionné, les objets fonctionnels ne font pas référence à leurs curseurs. pourtant, l'état de la base de données est connecté aux poignées de curseur et le comportement des objets de fonction dépend de l'état de la base de données.

J'ai cru comprendre que bien que vous ayez un handle sur un curseur de base de données, la base de données garantit "la cohérence et l'isolement" dans les transactions (définies ici, comme décrit par @ragi-yaser-burhum (profil) en ce qui concerne les performances d'ArcObjects ici). Ainsi, si vous relâchez le handle avant d'effectuer les mises à jour et perdez ces garanties, il mai être possible de mettre la base de données dans un état invalide.

Cela pourrait avoir un impact sérieux sur les opérations dans un environnement ArcSDE chargé. Cependant, mon expérience concerne principalement les géodatabases fichier, où un seul processus peut écrire dans une table à la fois. J'utilise une méthode d'extension sur les curseurs (non recyclés) pour récupérer toutes les IFeatures d'une liste<> et relâcher le curseur bien avant de l'éditer. Je n'ai jamais observé de comportement incohérent à partir de cela.

Je pourrais utiliser un peu plus de clarté sur ce sujet moi-même.