MapXtreme 2005 一些问题(八)

时间:2021-08-14 14:24:43

MapXtreme 2005 一些问题(八)

这个是我历经千山才弄出来的效果。

在处理的过程中,会有一些问题经常报错,网上几乎找不到资料可以解决了,本人经过大量实践,反复点击报错,代码步步注释的方法。

终于小有成果。

Table.BeginAccess(TableAccessMode.Write);这句代码,报错率非常高。

我们在修改一个表的时候,通常要begin一下,然后处理,处理完之后再end一下

在反复的begin与end中,一旦拿不到锁,就报错了。通常这个问题引起,是另一个表正在处理时,发生异常,你try完之后,没有endAccess引起的

 Table.DeleteFeature(feature);这句代码的报率也很高,网上流传这么一些代码:

foreach (Featrue fea  in  Table)
{
  Table.DeleteFeature(feature);
}

用来删除表的数据,这里报错率通常是由于Table.BeginAccess(TableAccessMode.Write);这个异常引起的
所以最好处理就是try一下Table.BeginAccess(TableAccessMode.Write);正常后,再执行删除表数据
这里有一点提的,其实里面的东西最后还是执行delete from table 
where  mkey = @mkey之类的语句,这样等于一条一条执行。
还不如直接执行delete from table就OK了,foreach来干什么。那个MISql操作的,几乎和ADO.net的操作一个样,不用担心不会。

最后一个就是最严重的问题了。
产生的问题是这样的:地图上画上的点,一开始好好的,然后点一下放大或细小,一会正常,一会又点不见了,再点一下,点又出来了,就这样反反复复。
一会正常,一会不正常。
经常反复大量研究表明:地图是存在Session中的,在研究中发现,Session经常不确定性的会丢失,所以,最好在画点的逻辑里加上一些处理:

我是这样处理的:
if  (CommonHelper.Get < string > ( " Command " "" ==   ""   ||  map.CustomProperties[ " layerCount " ==   null   ||  ( int )map.CustomProperties[ " layerCount " !=  map.Layers.Count)
            {                
                RUnitMapView mapView 
=   new  RUnitMapView(map);
                map.CustomProperties[
" layerCount " =  map.Layers.Count; // 预防Session的layer丢失
            }

找了一个地方保存下地图的图层数,由于生成了点之后,地图的图层一定会和初始图层不一样。所以,用了这个来做为判断Session是否丢失.
如果Session丢失,重新加载一下数据点的处理。这样,终于解决了问题.


改进篇

上述调用方式:
在MapXtreme 安装目录下,有一个MapXtremeControl的源码。
在上一篇中,由于调试不了源码,而只能在外面反复大量调试,以结果来猜测问题。以至于得出Session不稳定的结论。

先说说怎么调试MapXtremeControl

情况分析:

用Vs2005打开项目工程后,提示版本转化,直接转化即可,然后添加到项目引用。这时候,就算添加的是这个引用,也是无法调试的,因为在“C:\WINDOWS\assembly”目录下就存在了MapInfo.WebControls,所以默认会优化调用这个。
如果想调试你引用的项目,需要先卸载此目录下的DLL,直接右键卸载是行不通的。

卸载的方法如下:以下是网上搜到, 以前我搜的时候,是通过修改注册表,然后进行卸载的:

.NET   Framework中附带了一些和GAC有关的工具,其中包括:   
1 )Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly   
2 )Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native   Image   
3 )mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。 

卸载后,即可以调试你添加的项目了。

问题澄清的结论:

在调试进去后,最终又把问题引向自身了,关于Session的不稳定性,
是由于Session的两种配置方式的不同而引起的
这个一定要在项目之初就考虑清楚,而帮助文档里也有这么一段说明,不过当时没在意。

关于两种配置方式
1 。是用Session池,所有人共享Session,所有的保存都需要进行序列化,编码很麻烦,默认的示例也是这种方式,有点误导。WebConfig的配置有三点,帮助文档里有说到。
2 。是和普通的Session一个样,不需要序列化。编码简单,不过没有默认的救命。WebConfig配置一下即可。帮助文档里也有说到。
关于两种模式的使用情况,帮助文档里也有提到。多看帮助文档很重要,不然这个配置错误,引起的返工,是近乎重写所有的代码。