4 votos

Añadir un campo GUID con ArcObjects

Estoy intentando añadir un campo GUID mediante programación a una FeatureClass existente utilizando ArcObjects.

Aquí está mi código:

ISchemaLock schemaLock = (ISchemaLock)ipFC;

try
{
    // A try block is necessary, as an exclusive lock may not be available.
    schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);

    //Ajout d'un champ GUID
    IFieldsEdit pNewFieldsEdit = (IFieldsEdit)ipFC.Fields;
    IField guidField = new FieldClass();
    IFieldEdit guidFieldEdit = (IFieldEdit)guidField;
    guidFieldEdit.Name_2 = "OldGlobalID";
    guidFieldEdit.Type_2 = esriFieldType.esriFieldTypeGUID;
    guidFieldEdit.DefaultValue_2 = null;
    guidFieldEdit.IsNullable_2 = true;

    pNewFieldsEdit.AddField(guidField);
}
catch (Exception exc)
{
    // Handle this in a way appropriate to your application.
Console.WriteLine(exc.Message);
}
finally
{
    // Set the lock to shared, whether or not an error occurred.
    schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}

Todo parece funcionar (no hay error) y se basa en un ejemplo de documentación . Por desgracia, cuando hago clic en la clase de característica en ArcCatalog y abrir la vista previa de la tabla, tengo este mensaje que muestra:

enter image description here

Además, la tabla se abre en la vista previa, pero está toda vacía (cabecera y fila) con 308 registros (el número correcto de filas en la clase de características). ¿Qué estoy haciendo mal?

EDITAR

Si compruebo las propiedades de mi feature class, el nuevo campo parece estar ahí:

enter image description here

Pero la vista previa se ve así justo después del mensaje de error..:

enter image description here

¿Alguna idea?

EDITAR 2

He descubierto que cuando reinicio ArcCatalog y vuelvo a entrar en las propiedades, el nuevo campo ha desaparecido y no hay problema para abrir la vista previa de la tabla, pero el nuevo campo no aparece por ningún lado. ¿Tal vez hay una función para "Guardar" todo después de que el campo se ha añadido?

2voto

Goldorak84 Puntos 893

Si se observa con detenimiento el ejemplo de documentación se dará cuenta de que utilizan la función IFeatureClass::AddField

IField guidField = new FieldClass();
IFieldEdit guidFieldEdit = (IFieldEdit)guidField;
guidFieldEdit.Name_2 = "OldGlobalID";
guidFieldEdit.Type_2 = esriFieldType.esriFieldTypeGUID;
guidFieldEdit.DefaultValue_2 = null;
guidFieldEdit.IsNullable_2 = true;
ipFC.AddField(guidField);

En su caso, estaba utilizando la colección Fields de la clase feature para añadir su campo (método IFieldsEdit.AddField). Lo cual no está soportado, vea la sección de Observaciones en este artículo .

Observaciones

AddField se utiliza cuando se crea una colección de campos y no puede utilizarse para insertar un campo en una colección de campos perteneciente a una tabla existente. Para añadir un campo a una clase de objeto existente, utilice el método IClass::AddField.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X