4

I'm trying to add a GUID field programmatically to an existing FeatureClass using ArcObjects.

Here is my code:

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);
}

Everything seems to work (no error) and it's based on an documentation example. Unfortunately, when I click on the feature class in ArcCatalog and open the table preview, I have this message showing:

enter image description here

Also, the table open in the preview, but it's all empty (header and row) with 308 records(the correct number of row in the feature class). What am I doing wrong?

EDIT

If I check the properties of my feature class, the new field seems to be there:

enter image description here

But the preview looks like this right after the error message...:

enter image description here

Any ideas?

EDIT 2

I discovered that when I restart ArcCatalog and go back in the properties, the new field is gone and there is no problem opening the table preview, but the new field is nowhere to be found. Maybe there is a function to "Save" everything after the field has been added?

asked Jul 22, 2014 at 14:01
2
  • Are you getting a result from the AddField method when you perform it? For example, FDO_E_NO_SCHEMA_LICENSE can be returned on failure. Commented Jul 22, 2014 at 21:03
  • Thanks for your comment. Unfortunately, no error is caught during the whole process (you can see I have a try catch) and the AddField method returns 'void' in .NET. Commented Jul 23, 2014 at 12:00

1 Answer 1

2

If you take a closer look at the documentation example, you'll notice that they use the IFeatureClass::AddField function

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);

In your case, you were using the feature class Fields collection to add you field (IFieldsEdit.AddField method). Which is not supported, see the Remarks section in this article.

Remarks

AddField is used when creating a fields collection and cannot be used to insert a field into a fields collection belonging to an existing table. To add a field to an existing object class, use the IClass::AddField method.

answered Jul 28, 2014 at 14:06

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.