1、在arcEngine 中 mdb 转gdb 出现无法空间索引网格大小无效问题,终结了网上资料,将IFeatureClass 对象 转换IFeatureClassLoad并LoadOnlyMode=true,使用完后 LoadOnlyMode=false
2、关于使用完mdb后释放问题,在arcEngine 中调用 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject 进行释放,释放对象IWorkspaceFactory、IFeatureWorkspace、IEnumDataset、IFeature
代码例子
1 private void MDBToGDB(string GDBpath) 2 { 3 IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass(); 4 IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)Fact.OpenFromFile(GDBpath, 0); 5 IEnumDataset pEnumDataset = ((IWorkspace)pFeatureWorkspace).get_Datasets(esriDatasetType.esriDTAny); 6 pEnumDataset.Reset(); 7 #region 创建临时数据库 8 string savePath = "D:\\"; 9 string filename = System.IO.Path.GetFileNameWithoutExtension(GDBpath).ToLower(); 10 string gdbfile = filename + "_" + DateTime.Now.ToString("yyyyMMddHHmmss"); 11 IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass(); 12 IWorkspaceName workspaceName = workspaceFactory.Create(savePath, gdbfile, null, 0); 13 IName pTempName = (IName)workspaceName; 14 IWorkspace pTempWorkspace = (IWorkspace)pTempName.Open(); 15 #endregion 16 #region 复制要素 17 IDataset tDataset = pEnumDataset.Next(); 18 List<IDataset> datasets = new List<IDataset>(); 19 List<string> Layers = new List<string>(); 20 while (tDataset != null) 21 { 22 Layers.Add(tDataset.BrowseName); 23 datasets.Add(tDataset); 24 tDataset = pEnumDataset.Next(); 25 } 26 foreach (IDataset item in datasets) 27 { 28 IFeatureClass featureClass = item as IFeatureClass; 29 IFields pFields = (featureClass.Fields as IClone).Clone() as IFields; 30 IFeatureClass pDestFeatureClass = (pTempWorkspace as IFeatureWorkspace).CreateFeatureClass(item.BrowseName, pFields, new UIDClass(), new UIDClass(), featureClass.FeatureType, "SHAPE", ""); 31 IFeatureClassLoad pFclsLoad = pDestFeatureClass as IFeatureClassLoad; 32 pFclsLoad.LoadOnlyMode = true; 33 CopyTo(featureClass, pDestFeatureClass); 34 pFclsLoad.LoadOnlyMode = false; 35 } 36 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(Fact); 37 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pFeatureWorkspace); 38 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pEnumDataset); 39 foreach (IDataset item in datasets) 40 { 41 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(item); 42 } 43 #endregion 44 Dictionary<string, IFeatureClass> sourseLayers = new Dictionary<string, IFeatureClass>(); 45 foreach (string layername in Layers) 46 { 47 IFeatureClass pDestFeatureClass = (pTempWorkspace as IFeatureWorkspace).OpenFeatureClass(layername); 48 sourseLayers.Add(layername, pDestFeatureClass); 49 } 50 51 52 }
1 private void CopyTo(IFeatureClass pFromFeatureClass, IFeatureClass pToFeatureClass) 2 { 3 //得到当前工作空间 4 IWorkspace tWorkspace = (pToFeatureClass as IDataset).Workspace; 5 //得到当前编辑空间 6 IWorkspaceEdit tWorkspaceEdit = tWorkspace as IWorkspaceEdit;// GetNewEditableWorkspace(tWorkspace); 7 8 tWorkspaceEdit.StartEditing(false); 9 tWorkspaceEdit.StartEditOperation(); 10 //设置游标状态为插入 11 IFeatureCursor tFeatureCursor1 = pToFeatureClass.Insert(true); 12 //设置要素缓存 13 IFeatureBuffer tFeatureBuffer = pToFeatureClass.CreateFeatureBuffer(); 14 15 //获取源文件要素类的的记录集游标 16 IFeatureCursor tFeatureCursor2 = pFromFeatureClass.Search(null, true); 17 //复制每个要素 18 IFeature tFeature = tFeatureCursor2.NextFeature(); 19 int number = 0; 20 while (tFeature != null) 21 { 22 23 number++; 24 IFields Flds = pFromFeatureClass.Fields; 25 for (int i = 0; i < Flds.FieldCount; i++) 26 { 27 //获取对应字段的索引 28 IField Fld = Flds.get_Field(i); 29 int index = tFeatureCursor2.Fields.FindField(Fld.Name); 30 if (index < 0) continue; 31 if (!Fld.Editable) continue; 32 if (Fld.Type == esriFieldType.esriFieldTypeGeometry) continue; 33 34 35 //字段赋值 36 tFeatureBuffer.set_Value(index, tFeature.get_Value(i)); 37 } 38 tFeatureBuffer.Shape = tFeature.ShapeCopy; 39 40 //插入要素 41 tFeatureCursor1.InsertFeature(tFeatureBuffer); 42 if (number > 100) 43 { 44 tFeatureCursor1.Flush(); 45 number = 0; 46 } 47 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(tFeature); 48 tFeature = tFeatureCursor2.NextFeature(); 49 } 50 tFeatureCursor1.Flush(); 51 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(tFeatureCursor1); 52 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(tFeatureCursor2); 53 GC.Collect(); 54 tWorkspaceEdit.StopEditOperation(); 55 //结束编辑 56 tWorkspaceEdit.StopEditing(true); 57 }