做ArcIMS不能離開SDE,用上SDE不能不訪問資料庫。Flex訪問資料還算方便,訪問資料庫那個麻煩啊!總的來說.Net平台解決方案有WebService與Remoting,對於在內網或者VPN的情況下Remoting效率還算可以,不過做起來羅嗦還有發布問題。一般來說使用WebService的比較多,但是WebService的效率實在不敢恭維,今天Flex重點還是放在另外一條思路上--Asp.net,今天比較鬱悶由於地圖資料移轉到Oracle上搞了半天才有時間照顧Flex進展,原來的中文圖層名與欄位換成了英文,用IMS訪問看來是拿不到中文了,還好在資料庫中定義了中英文的圖層名與欄位對照表,可以通過Flex訪問資料庫來彌補,如果用WebService的話不可避免的長時間的buzyCursor,再看看訪問IMS伺服器的時候使用UrlRequest就能發送資料還能擷取結果,效率似乎不錯,於是就想起來自己寫幾個Asp.net頁面,通過Asp.net訪問資料庫(好親切的DAAB啊).
廢話不多羅嗦了,首先寫個asp.net網頁,訪問一個Oracle資料庫。
在web.config中添上一段,用來給DAAB讀取資料庫配置
<connectionStrings>
<add name="PC_Ora" connectionString="Data Source=gisdata;User Id=***;Password=***" providerName="System.Data.OracleClient"/>
</connectionStrings>
建立一個頁面,在PageLoad裡面寫上
Database db = DatabaseFactory.CreateDatabase( "PC_Ora" );
StreamReader sr = new StreamReader( this.Request.InputStream );
string tbName = sr.ReadToEnd();
string sqlGetLayerInfo = "select TABCAP from sys_tabname t where UPPER(t.tabname) like '" + tbName.ToUpper() + "'";
IDataReader dr = db.ExecuteReader( CommandType.Text, sqlGetLayerInfo );
this.Response.ContentType = "text/xml";
while ( dr.Read() )
{
Response.Write( dr[0].ToString() );
}
這樣查詢的資料就能夠寫到頁面裡面了
怎麼拿到呢?
萬能的URLRequest登場了
不多說在通過ArcIMS擷取圖層名稱時候
public function set Name(na:String):void
{
this.name = na;
var capReq:URLRequest = new URLRequest();
capReq.url = "http://10.25.2.45/webwork/FlexDataService/GetData.aspx";
capReq.method ="POST";
capReq.data = na;
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE, layerCompleteHandler);
try {
urlLoader.load(capReq);
} catch (error:Error) {
mx.controls.Alert.show("發送請求錯誤","ASP.Net請求",4,null);
}
}
以上的IP是內網地址,不要訪問
C#代碼中的
StreamReader sr = new StreamReader( this.Request.InputStream );
string tbName = sr.ReadToEnd();
得到的結果自然就是ActionScript代碼中na的值了
下面就不用多說了吧,像訪問IMS那樣拿出dada,解析就能獲得資料了
private function layerCompleteHandler(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
var st:String = loader.data;
this.caption = st.substr(0, st.indexOf("\r"));
var fldReq:URLRequest = new URLRequest();
}注意要"\r",如果完全取出data,就包含了html代碼了。
總的說來這種方式比WebService方式要快不少,但是對於批量資料怎麼辦?比如屬性工作表什麼的,看來還是得WebService或者能利用Asp.net通過DataSet的XML來走,還沒有嘗試。終於介面上看不到E文了。
突然發現,我的圖層樹只能顯示圖層名稱,這個可不行,怎麼說圖層控制和菜單還是要的,如何?TOC呢,請看下一期的Flex RIA的ArcIMS WebGIS之路--Flex自定控制項實現圖層TOC
ps:這一期其實早就寫了一部分,由於比較忙落下了。一次偶然搜尋資料的時候,看到有位校友,可能是師弟吧轉載了前兩期。吼吼,歡迎大家評論!