OCCI读写Oracle Spatial的SDO_Geometry
在命令行下进入你intype.typ的目录,生成的文件就在这个目录。
sdo_point里保存的是Number类型的数据。
可以用float f = float(number);
![](https://images.cnblogs.com/cnblogs_com/greatverve/2012113001.jpg)
OTT是Oracle数据库的数据类型翻译工具,可以把Oracle中的数据类型翻译为C++类。
在使用Oracle Spatial的时候,需要通过OTT把MDSYS方案中有关空间数据结构翻译为C++类。
在网上找了半天有关OTT使用的方法,基本上都说的不清不楚。
没办法,自己看Oracle的b14294文档——是关于OCCI的,里面有讲到OTT的使用。
OTT的命令如下:
ott attraccess=private code=cpp cppfile=spatial_classes.cpp hfile=spatial_classes.h
intype=spatial.typ mapfile=spatial_classes_map.cpp mapfunc=RegisterClasses userid=MDSYS/password
其中,intype=spatial.typ这一项参数可以省去。如果省去就会把user方案中的所有数据类型都翻译出来。
因此,可以简单自己定义一个typ文件,只把需要的几个类型翻译出来就可以了。
最简单的typ文件象下面这样就可以了:
TYPE MDSYS.SDO_GEOMETRY
TYPE MDSYS.SDO_POINT_TYPE
以上内容用文本文件保存为spatial.typ,然后用上门的ott命令,就会生成spatial_classes.h、spatial_classes.cpp、spatial_classes_map.h、spatial_classes_map.cpp四个文件。
在vc工程中通过使用occi和这四个文件就可以进行Oracle Spatial编程了。
网上有关使用OCCI访问Oracle Spatial的资料比较少,在用VS2005编写occi程序时出现了好几个Oracle错误,经过在网上淘,总算逐个解决了。结果很简单,过程很艰难,作一个小结还是有必要的。
错误1:ORA-21301:没有按对象模式进行初始化
原因:要用OBJECT模式初始化环境才能操作SDO_GEOMETRY空间对象
网上很多关于OCCI示例代码中都是:
Environment *pEnv = Environment::createEnvironment (Environment::DEFAULT);
但是要操纵SDO_GEOMETRY空间对象,应该用OBJECT模式:
Environment *pEnv = Environment::createEnvironment (Environment::OBJECT);
错误2:ORA-32162:读/写SQL的方法未注册
原因:用ott生产有关oracle spatial的c++代码时,有一个class map的文件,例如spatial_classes_map.h、spatial_classes_map.cpp。这个文件里有一个RegisterClasses函数,用于注册生产的spatial类(SDO_GEOMETRY等)中读写SQL的方法。因此在创建数据库连接之前,要进行注册:
RegisterClasses(pEnv);
错误3:OCI-22625
关于这个错误,没有给出具体信息。搜遍了百度、google、yahoo,找遍中外网站,唯一的答案是:这是Oracle occi的一个bug,在9201版之后已经解决了。
晕啊,我用的vs2005、orcle 0cci for vc8 10.2.0.3。不是早就解决了吗?折腾了一个下午,反复检查代码,用各种方式测试,实在没发现什么问题。后来改用release模式编译运行,咦,没有出现这个错误。然后对比检查vs中debug和release的编译环境,还是没发现问题,debug模式下还是出现这个错误。
反复在网上找,没有其他的信息,寻思还是应该是oracle的bug。最后总算在oracle网站上发现occi 10.2.0.3还有两个patch,分别是patch 10和patch 13。下载,把编译库改为patch 13的lib,编译运行,问题解决!
我这个博客废弃不用了,今天想寻找外链的时候,突然想到这个博客权重很高。
有需要免费外链的,留言即可,我准备把这个博客变成免费的友情链接站点。