关于 arcgisengine mdb 转gdb 无法空间索引网格大小无效问题和mdb释放问题 总结


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         }

 




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM