Flex RIA的ArcIMS WebGIS之路(三)--通过Asp.net数据库的访问,不是WebService哦!
做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:这一期其实早就写了一部分,由于比较忙落下了。一次偶然搜索资料的时候,看到有位校友,可能是师弟吧转载了前两期。吼吼,欢迎大家评论!