MapX直连Oracle——MapX5配合Oracle时,对中文表名支持不好

隐藏行号 复制代码 MapX直连Oracle
  1. public void  LoadServerTableMap(string TableName)
  2. {
  3.     MapXLib.Layer lyr;
  4.     MapXLib.LayerInfo LayerInfo;
  5.     LayerInfo = new LayerInfoClass();
  6.     LayerInfo.Type = LayerInfoTypeConstants.miLayerInfoTypeServer;
  7.     LayerInfo.AddParameter("NAME", TableName);
  8.     LayerInfo.AddParameter("connectstring", "uid=map;pwd=abc;srvr=Map");
  9.     LayerInfo.AddParameter("query", "select * from " + TableName+";");
  10.     LayerInfo.AddParameter("cache", "off"); 
  11.     LayerInfo.AddParameter("MBRSearch", "on");
  12.     LayerInfo.AddParameter("toolkit", "ORAINET"); 
  13.     LayerInfo.AddParameter("AutoCreateDataset", 1);
  14.     LayerInfo.AddParameter("datasetname", TableName);
  15.     lyr = axMap.Layers.Add(LayerInfo, 1);
  16.     lyr = null;
  17.     LayerInfo = null;
  18. }

上面这串代码,是我翻译的VB6的。MapX相当的可恶,VB6与C#上面差异好多。就拿LayerInfo这个类吧。在C#这个类名只是个接口,而实际的类名为:LayerInfoClass。这不是折腾人嘛。还有些函数在C#里面参数一定要写全了,而VB6里面参数可以不写全。等等等等。目前为止我很讨厌MapX。

错误发觉篇

开始我们买的地图由于是中文名命名的tab文件,所以使用EasyLoader上传时候同样的采用中文名字。这就给我造成好长时间的麻烦。

private void button1_Click(object sender, EventArgs e)
{
    LoadServerTableMap("二级道路");
}

开始用上面代码直连Oracle调用地图,它总是报错。且错误令人匪夷所思。

image

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文件名改成汉语拼音的。

到网上搜了搜软件,有专门批量转换文件名为拼音的。
image
这软件到也很好用。使用他修改了文件名。然后用Oracle的客户端管理界面把原来的表给删除了(那个JAVA的管理软件删除表可真它妈慢呀)。然后用 EasyLoader批量上传。传说中的空间数据库地图信息终于显示在了我的MapX空间上面。我那个泪流满面啊~~~~~~。

image

完结

原文地址:https://www.cnblogs.com/edzjx/p/1579867.html