private static void deleteFields(IFeatureClass featureClass)
{
ISchemaLock schemaLock = featureClass as ISchemaLock;
try
{
schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
deleteField(featureClass, "ANGLE");
deleteField(featureClass, "SCALE");
deleteField(featureClass, "POLYGONID");
deleteField(featureClass, "GM_S_ARG");
deleteField(featureClass, "GM_I_ARG");
deleteField(featureClass, "GM_FEATURE");
deleteField(featureClass, "GM_CATEGORY");
deleteField(featureClass, "GM_VALID_ELEVATI");
deleteField(featureClass, "GM_SOURCE_T_SCAL");
deleteField(featureClass, "GEOPOINT_ID");
deleteField(featureClass, "GEOPOINT");
deleteField(featureClass, "PERIMETER");
deleteField(featureClass, "AREA");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
}
private static void deleteField(IFeatureClass featureClass, String fieldName)
{
int index = featureClass.FindField(fieldName);
IFields fields = featureClass.Fields;
IField field = null;
if (index != -1)
{
field = fields.get_Field(index);
featureClass.DeleteField(field);<-----AccessViolationException (not at first call)
}
else
Console.WriteLine(fieldName + " not found");
}
[STAThread()]
static void Main(string[] args)
{
m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeArcInfo },
new esriLicenseExtensionCode[] { });
IWorkspace workspace = connectToFileGDB();
IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace;
featureClass = featureWorkspace.OpenFeatureClass("geopoint_point");
try
{
deleteFields(featureClass);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
//Do not make any call to ArcObjects after ShutDownApplication()
m_AOLicenseInitializer.ShutdownApplication();
}
private static IWorkspace connectToFileGDB()
{
string nameOfFile = "D:\\Documents and Settings\\mbw\\Skrivebord\\Langsom\\G500_k4_GeoPoint_2.gdb";
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)new FileGDBWorkspaceFactoryClass();
IWorkspace workspace = workspaceFactory.OpenFromFile(nameOfFile, 0);
return workspace;
}
ERROR 999998: Unexpected Error.
Failed to execute (DeleteField).
private static String inFeatureClassName = "geopoint_point";
private static IFeatureClass featureClass;
private static void deleteFields()
{
try
{
deleteField("ANGLE");
deleteField("SCALE");
deleteField("POLYGONID");
deleteField("GM_S_ARG");
deleteField("GM_I_ARG");
deleteField("GM_FEATURE");
deleteField("GM_CATEGORY");
deleteField("GM_VALID_ELEVATI");
deleteField("GM_SOURCE_T_SCAL");
deleteField("GEOPOINT_ID");
deleteField("GEOPOINT_");
deleteField("PERIMETER");
deleteField("AREA");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
// Something wrong, Cashes with AccesViolationException
private static void deleteField(String fieldName)
{
refreshFeatureClass();
int index = featureClass.FindField(fieldName);
IFields fields = featureClass.Fields;
IField field;
if (index != -1)
{
field = fields.get_Field(index);
try
{
featureClass.DeleteField(field);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Marshal.FinalReleaseComObject(field);
}
else
Console.WriteLine(fieldName + " not found");
Marshal.FinalReleaseComObject(fields);
}
private static void refreshFeatureClass()
{
IFeatureWorkspace featureWorkspace = featureClass.FeatureDataset.Workspace as IFeatureWorkspace;
Marshal.FinalReleaseComObject(featureClass);
featureClass = featureWorkspace.OpenFeatureClass(inFeatureClassName);
}
AccessViolationException
Message = "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
First make a list of all the field objects to delete, and then delete them one by one.