//此處用的workspace來源與用戶選擇 IWorkspace workspace = null; //workspace通常等同於數據庫 //工做空間類型,也可理解爲數據庫類型 //esriFileSystemWorkspace:可能爲shp //esriLocalDatabaseWorkspace:可能爲file gdb,mdb //esriRemoteDatabaseWorkspace:可能爲sde esriWorkspaceType workspaceType = workspace.Type; //路徑,對於本地文件類型的(例如shp,file gdb,mdb)有意義,就是他們的文件路徑 string path = workspace.PathName; //數據庫鏈接配置,一般對於sde有效 IPropertySet propertySet = workspace.ConnectionProperties; //如下是遍歷他的值的代碼 object objNames = null; object objValue = null; //獲取全部值,結構是相似字段的key/value格式,參數1是name的數組,參數2是value的數組 //參數類型是object,但實際分別是string數組和object數組 propertySet.GetAllProperties(out objNames, out objValue); string[] names = (string[])objNames; object[] values = (object[])objValue; //遍歷獲取各個值 for (int i = 0; i < names.Length; i++) { //參數名 string name = names[i]; //參數值 string value = values[i].ToString(); } //如下代碼因爲不具有測試數據,只看代碼不運行 if (1 == 2) { //執行原生sql //若是Workspace數據類型是數據庫如sde,能夠經過此方法執行原生sql //這裏只能執行不返回結果的sql,例如insert,update等,而不能select workspace.ExecuteSQL("update xxx set eee=111"); } //PS:以上代碼能夠獲取sde數據庫的配置,但密碼獲取到的是亂碼,由於想在ae獲取sde完整的鏈接參數(一般用於再次新建對sde的鏈接)是不可能的 //遍歷workspace下全部的數據集 //get_Datasets方法用於獲取workspace下的成員,參數1是獲取的數據類型 //IEnum開頭的接口相似於遊標,用於遍歷一些查詢結果 IEnumDataset enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); enumDataset.Reset(); //由於下面還要遍歷數據集下的featureClass,所以用了IFeatureDataset,其實也能夠as到IDataset IFeatureDataset featureDataset = null; while ((featureDataset = enumDataset.Next() as IFeatureDataset) != null) { //數據集的基礎屬性 IDataset dataset = featureDataset as IDataset; //數據集名稱 string datasetName = dataset.Name; //數據集類型 esriDatasetType datasetType = dataset.Type; //IGeoDataset是幾何相關的接口 IGeoDataset geoDataset = featureDataset as IGeoDataset; //空間參考 ISpatialReference spatialReference2 = geoDataset.SpatialReference; //獲取數據集下全部的featureClass IFeatureClassContainer featureClassContainer = featureDataset as IFeatureClassContainer; IEnumFeatureClass enumFeatureClass = featureClassContainer.Classes; enumFeatureClass.Reset(); IFeatureClass featureClass = null; //遍歷數據集裏的要素類 while ((featureClass = enumFeatureClass.Next()) != null) { } //IEnum開頭的接口用完都要手動釋放(與遊標同樣) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumFeatureClass); } //IEnum開頭的接口用完都要手動釋放(與遊標同樣) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumDataset); //遍歷workspace下的featureClass //PS:結合上面的代碼能夠注意到,獲取數據集下的featureClass和獲取workspace下的featureClass的代碼是分開的 enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureClass); enumDataset.Reset(); IFeatureClass featureClass2 = enumDataset.Next() as IFeatureClass; while ((featureClass2 = enumDataset.Next() as IFeatureClass) != null) { } //IEnum開頭的接口用完都要手動釋放(與遊標同樣) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumDataset); //獲取Workspace的全部FeatureClass(包括Dataset裏面的) List<IFeatureClass> lstFeatureClass = WorkspaceEdmHelper.GetAllFeatureClassInWorkspace(workspace as IFeatureWorkspace); //Workspace關於featureClass操做的接口 IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace; //如下代碼因爲不具有測試數據,只看代碼不運行 if (1 == 2) { //經過名稱獲取featureClass //PS:即便featureClass在數據集下也能夠這樣獲取,這點跟遍歷不一樣 featureClass2 = featureWorkspace.OpenFeatureClass("www"); //經過名稱獲取數據集 featureDataset = featureWorkspace.OpenFeatureDataset("rrr"); //經過文件路徑或數據庫鏈接參數,新建數據庫或打開數據庫 //建立File Gdb,參數1是文件所在文件夾,參數2是數據庫名稱 //因爲一個file gdb數據庫等同於一個workspace,所以建立file gdb等同於建立workspace featureWorkspace = WorkspaceEdmHelper.CreateFileGdb("C:\\aaa", "test.gdb"); //建立personal gdb(mdb),參數1是文件所在文件夾,參數2是數據庫名稱 featureWorkspace = WorkspaceEdmHelper.CreatePersonalGdb("C:\\aaa", "test.mdb"); }
被調用的封裝函數代碼以下sql
/// <summary> /// 獲取Workspace的全部FeatureClass(包括Dataset裏面的) /// </summary> /// <param name="featureWorkspace"></param> /// <returns></returns> public static List<IFeatureClass> GetAllFeatureClassInWorkspace(IFeatureWorkspace featureWorkspace) { IWorkspace workspace = featureWorkspace as IWorkspace; List<IFeatureClass> featureClassResult = new List<IFeatureClass>(); //首先遍歷數據集 IEnumDataset enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); enumDataset.Reset(); IFeatureDataset featureDataset = enumDataset.Next() as IFeatureDataset; while (featureDataset != null) { IFeatureClassContainer featureClassContainer = featureDataset as IFeatureClassContainer; IEnumFeatureClass enumFeatureClassTarget = featureClassContainer.Classes; enumFeatureClassTarget.Reset(); IFeatureClass featureClass = enumFeatureClassTarget.Next(); //遍歷數據集裏的要素類 while (featureClass != null) { featureClassResult.Add(featureClass); featureClass = enumFeatureClassTarget.Next(); } System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumFeatureClassTarget); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureDataset); featureDataset = enumDataset.Next() as IFeatureDataset; } System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumDataset); //而後遍歷在數據庫根目錄的要素類 enumDataset = workspace.get_Datasets(esriDatasetType.esriDTFeatureClass); enumDataset.Reset(); IFeatureClass featureClass2 = enumDataset.Next() as IFeatureClass; while (featureClass2 != null) { featureClassResult.Add(featureClass2); featureClass2 = enumDataset.Next() as IFeatureClass; } System.Runtime.InteropServices.Marshal.FinalReleaseComObject(enumDataset); return featureClassResult; } /// <summary> /// 建立Fiel Gdb /// </summary> /// <param name="directory"></param> /// <param name="gdbName"></param> /// <returns></returns> public static IFeatureWorkspace CreateFileGdb(string directory, string gdbName) { IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass(); IName name = (IName)workspaceFactory.Create(directory, gdbName, null, 0); return (IFeatureWorkspace)name.Open(); } /// <summary> /// 建立Personal Gdb(Mdb) /// </summary> /// <param name="directory"></param> /// <param name="gdbName"></param> /// <returns></returns> public static IFeatureWorkspace CreatePersonalGdb(string directory, string gdbName) { IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass(); IName name = (IName)workspaceFactory.Create(directory, gdbName, null, 0); return (IFeatureWorkspace)name.Open(); }