MapX直连Oracle——MapX5配合Oracle时,对中文表名支持不好
public void LoadServerTableMap(string TableName)
{
MapXLib.Layer lyr;
MapXLib.LayerInfo LayerInfo;
LayerInfo = new LayerInfoClass();
LayerInfo.Type = LayerInfoTypeConstants.miLayerInfoTypeServer;
LayerInfo.AddParameter("NAME", TableName);
LayerInfo.AddParameter("connectstring", "uid=map;pwd=abc;srvr=Map");
LayerInfo.AddParameter("query", "select * from " + TableName+";");
LayerInfo.AddParameter("cache", "off");
LayerInfo.AddParameter("MBRSearch", "on");
LayerInfo.AddParameter("toolkit", "ORAINET");
LayerInfo.AddParameter("AutoCreateDataset", 1);
LayerInfo.AddParameter("datasetname", TableName);
lyr = axMap.Layers.Add(LayerInfo, 1);
lyr = null;
LayerInfo = null;
}
上面这串代码,是我翻译的VB6的。MapX相当的可恶,VB6与C#上面差异好多。就拿LayerInfo这个类吧。在C#这个类名只是个接口,而实际的类名为:LayerInfoClass。这不是折腾人嘛。还有些函数在C#里面参数一定要写全了,而VB6里面参数可以不写全。等等等等。目前为止我很讨厌MapX。
错误发觉篇
开始我们买的地图由于是中文名命名的tab文件,所以使用EasyLoader上传时候同样的采用中文名字。这就给我造成好长时间的麻烦。
private void button1_Click(object sender, EventArgs e) { LoadServerTableMap("二级道路"); }
开始用上面代码直连Oracle调用地图,它总是报错。且错误令人匪夷所思。
Oracle Error: OCI RC=-1, DBMS RC=4043, DBMS Msg=ORA-04043: 对象 map.二级 不存在
表名只剩下一半了。开始以为Oracle对中文支持不够好。特意在SQL语句里面加了引号:
LayerInfo.AddParameter("query", "select * from \"" + TableName+"\";");
就是加引号还是报错。
Oracle Error: OCI RC=-1, DBMS RC=1740, DBMS Msg=ORA-01740: 标识符中缺失双引号
ORA-01740: 标识符中缺失双引号。
这个错误把我弄得很郁闷。找了半天都不知道原因是什么。后来一次实验操作让我明白了。我开始以为是不是MapX在操作中文的时候没有取全字符即4个中文字符它以4个西文字符长度取,所以怎么取都取不全。有了猜测后,我做了实验:
LoadServerTableMap("二级道路 ");
在中文表名后面加了4个全角空格。终于可以通过SQL了。可惜的是,还是报错。
DBMS Error, found Object column but no MapCatalog entry exists.
不管怎样我算是明白了。这个鸡巴东西太歧视中文了。
解决错误篇
解决办法就是用西文字符的表面。我想到转换成汉语拼音。可是如果手动修改表名岂不累翻我?于是乎决定动小聪明。由于Oracle里的表都是通过EasyLoader上传上去的。因为上传之前的tab文件名为中文所以导致了上传后的表名也为中文。想象最简单的办法就是把中文的tab文件名改成汉语拼音的。
到网上搜了搜软件,有专门批量转换文件名为拼音的。
这软件到也很好用。使用他修改了文件名。然后用Oracle的客户端管理界面把原来的表给删除了(那个JAVA的管理软件删除表可真它妈慢呀)。然后用 EasyLoader批量上传。传说中的空间数据库地图信息终于显示在了我的MapX空间上面。我那个泪流满面啊~~~~~~。