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.