1. 程式人生 > >最近在ArcGIS Engine開發中關於呼叫gp工具過程出現COM 元件的呼叫返回了錯誤 HRESULT E_FAIL 錯誤的解決方法 和 學習oracle中遇到的一些問題總結

最近在ArcGIS Engine開發中關於呼叫gp工具過程出現COM 元件的呼叫返回了錯誤 HRESULT E_FAIL 錯誤的解決方法 和 學習oracle中遇到的一些問題總結

首先說下AE開發中關於gp這一塊的東西,gp是一個很方便的工具,利用gp可以在程式碼中實現ArcMap工具箱中的大部分內容,關於gp工具的使用我就不說了,這些大部分都可以在網上找到,我要說的是gp使用過程中遇到的問題:

一般gp的報錯為 對 COM 元件的呼叫返回了錯誤 HRESULT E_FAIL。如下圖

遇到這樣的問題的可能原因目前我所知道有三個:

1、引數缺少或者引數型別不正確,這是最容易解決的,改變正確的引數型別即可;

2、引數路徑不正確,或者gp的overwrite屬性未設定,例如一個不存在的路徑或者該路徑下已有同名檔案,這個問題就需要設定overwrite屬性為true;

3、重點來了,排除以上兩個錯誤的情況下還是出現了這種問題,很多人估計就束手無策了,我查閱了很多資料,最後發現是gp使用的某些工具必須需要足夠的許可權來執行,一般我們axlicenseconrol控制元件預設的是arcgisengine許可權,如下圖


我們在使用gp的某些功能,例如我使用的ESRI.ArcGIS.AnalysisTools.Erase這個工具,這個許可權就不夠了


因此報出了上面的錯誤,那麼怎麼解決呢,很簡單,勾選許可權最大的ArcInfo(10.1以上可能對應的advanced)即可,有時候我們需要使用擴充套件模組的功能的時候可以按需勾選右邊的擴充套件,到此一般可以正常執行程式碼了,有時候可能這樣還不能解決問題,就需要用程式碼來賦予許可權

相關程式碼如下:

IAoInitialize m_AoInitialize = new AoInitializeClass();
esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;

licenseStatus = m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcInfo);//裡面的esriLicenseProductCode後面的產品可以自己選擇
 新增相關程式碼在主窗體的建構函式的InitializeComponent();前面即可
再說下關於昨天在oracle學習的分頁問題,我不知道是不是版本的問題,在oracle11g中的分頁程式碼
select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rownum>=6;
這句貌似在oracle9i中可以正確執行
但是在oracle11g中就不能執行了 只能返回列名
找來很多資料後來發現 原來是最後的那個where的rownum應該換成rn
想了一下原理 
select * from emp //是查詢emp表
select a1.*,rownum rn from (select * from emp) a1 where rownum<=10 //對上面查詢出來的表查詢出rownum小於等於10的列
select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rownum>=6;本來意思是對查詢出來的表查詢出rownum小於10的列再進行一次查詢查詢出大於等於6的列 預期返回6到10 一共5行資料 但是返回的結果是空的
換成
select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rn>=6; 正確執行
其實想想原理也很簡單 我們可以先執行第二步的查詢語句看看輸出結果

得到的是一張表,我們可以理解為內嵌檢視,那麼第三步就是對這張表查詢 此時的rn代表的是這張表的一個列名,因此rn>=6就很容易理解了,假設這張表我們叫t表,那麼第三步查詢就相當於
select * from t where rn>=6; 
是不是這樣就很好理解為什麼後面一個rownum應該改成rn;
筆者這裡就想到了能不能第二步的查詢裡面的rownum也改成rn呢,測試了一下結果如下:
顯示識別符號無效,這裡也很好理解 因為第一步查詢出來的emp表是沒有rownum這一列
這樣就完美解決了分頁的問題。
說點題外話,在java連線oracle資料庫的時候有多種方式,我所知jdbc_odbc橋接和jdbc連線
對應的連線引數為
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//2.得到連線
Connection connection=DriverManager.getConnection("jdbc:odbc:testorcl","scott","tiger");
//載入驅動
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
//得到連線 jdbc:oracle:thin:@localhost:1521:orcl
Connection connection=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","scott","tiger");
在web專案和java專案中要分別引入對應的包 一般在oracle安裝目錄的jdbc目錄有有對應的jar驅動包
在web專案中要匯入到專案根目錄的WEB-INFO的lib目錄下
另外筆者是第一次在csdn發博文,好多配圖在釋出的過程中不見了 影響了大家閱讀 希望大家多批評指正