關於異常來自 HRESULT:0x80040351


今天在進行打開工作空間操作的時候突然報錯“異常來自 HRESULT:0x80040351”。

分析后發現是IWorkspaceFactory實現類的對應關系不對。本來想操作數據庫中的.gdb文件,但是聲明的時候卻寫成了IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactory();后來改成IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();問題就迎刃而解了。慚愧...

 

轉一份“Arcengine中打開各種數據源(WorkSpace)的連接”,數據源類型包括SDE、personal/File、ShapeFile、CAD數據、影像圖、影像數據集。

 

1.企業數據庫(SDE)

企業數據庫需要使用SDE來管理,所以需要使用SDE的Workspace來表示連接。在AE接口中,Workspace是由Factory打開的。代碼如下:

//准備連接參數 ESRI.ArcGIS.esriSystem.IPropertySet pPropSet=new PropertySetClass(); pPropSet.SetProperty("server","服務器機器名" ); pPropSet.SetProperty("instance","SDE運行的端口號"); pPropSet.SetProperty("user","用戶名"); pPropSet.SetProperty("password","口令" ); pPropSet.SetProperty("version","版本"); SdeWorkspaceFactory sdeWkspFact=new SdeWorkspaceFactoryClass(); IFeatureWorkspace pFeaWksp=(IFeatureWorkspace)sdeWkspFact.Open(pPropSet,0); 其中唯一需要解釋的可能就是版本(version).對於沒有使用版本或者第一次連接(沒有建立空間數據庫,當然沒有版本了). 該處使用sde.DEFAULT這個版本。這是默認的版本。 iPropertySet:: setProperty public void setProperty(string name,object value)
2.個人數據庫(PersonalGeodatabase、FileGeodatabase) ArcEngine中個人數據庫為Access。 string filePath="E:\\tt.mdb"; AccessWorkspaceFactory fac=new AccessWorkspaceFactoryClass(); IFeatureWorkspace space=(IFeatureWorkspace)fac.OpenFromFile(filePath,0); 這是用的最多的一種方式. 如果是FileGeodatabasse,則將 FileGDBWorkspaceFactory pWSF = New FileGDBWorkspaceFactory; IFeatureWorkspace pWS1= pWSF.OpenFromFile(sPath, 0); 如果用IPropertySet。如下: //Personal Geodatabase e.g., database = "C:\\myData\\mypGDB.mdb" public IWorkspace open_pGDB_Workspace(string database) { IPropertySet propertySet = new PropertySetClass(); propertySet.SetProperty("DATABASE", database); IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass(); return workspaceFactory.Open(propertySet, 0); }
3.Shapefile文件 Shapefile和Access的打開方式有一點相同。也有差異。 //這是Shape所在的目錄(注意:是目錄) string spacePath="E:\\shapefile"; IShapefileWorkspaceFactory fac=new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace space=(IFeatureWorkspace)fac.OpenFromFile(spacePath,0); IFeatureClass fc=space.openFeatureClass(“china”);
4.AutoCAD dwg文件 AutoCAD文件和一般的ESRI格式不同。所以代碼會有一點點奇怪。假設有一個dwg文件為E:\\cad\\107.dwg 下面是打開的代碼: CadWorkspaceFactoryClass fac=new CadWorkspaceFactoryClass (); String filePath="E:\\cad"; IFeatureWorkspace space=fac.OpenFromFile(filePath,0) as IFeatureWorkspace ; 下面是打開FeatureClass的代碼: //線 IFeatureClass polyline =space.OpenFeatureClass("107.dwg:Polyline"); IFeatureLayer layer=new CadFeatureLayerClass (); layer.FeatureClass =polyline; //點 IFeatureClass point=space.OpenFeatureClass ("107.dwg:Point"); layer=new CadFeatureLayerClass (); layer.FeatureClass =point; //面 IFeatureClass polygon=space.OpenFeatureClass ("107.dwg:Polygon"); layer=new CadFeatureLayerClass(); layer.FeatureClass =polygon; //注記 IFeatureClass anno=space.OpenFeatureClass ("107.dwg:Annotation"); layer=new CadAnnotationLayerClass(); layer.FeatureClass =anno;
5.影像圖文件 //文件路徑 string filePath="E:\\image\\117.tif"; IRasterLayer rasterLayer=new RasterLayerClass(); rasterLayer.CreateFromFilePath(filePath );
6.數據庫中的影像數據集。 //數據庫連接 IWorkspace space=OpenSpace(); //打開數據庫的方式 IRasterWorkspaceEx rasterSpace=(IRasterWorkspaceEx)space; IRasterDataset rasterDataset=rasterSpace.OpenRasterDataset (setName.Name ); IRasterLayer rasLayer=new RasterLayerClass(); rasLayer.CreateFromDataset(rasterDataset); IRasterWorkspaceEx:提供創建和打開柵格目錄或柵格數據集的方法。 但是IRasterWorkspaceEx,IRasterWorkspace, IRasterWorkspace2都有OpenRasterDataset。IRasterWorkspace經常也可用於打開柵格數據,如:
pWorkspaceFactory = new RasterWorkspaceFactoryClass(); pRasterWorkspace = (IRasterWorkspace)pWorkspaceFactory.OpenFromFile(filePath, 0); IRasterDataset pRasterDataset = (IRasterDataset)pRasterWorkspace.OpenRasterDataset(fileName); IRasterLayer pRasterLayer = new RasterLayerClass(); pRasterLayer.CreateFromDataset(pRasterDataset);

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM