OCCI读写Oracle Spatial的SDO_Geometry

1.使用Oracle OTT工具生成对应的C++类。
1.1设置ORACLE_HOME:服务器端安装目录。
设置客户端安装目录,提示什么java错误。
暂时不管了。
1.2写一个intype文件test.typ放在D盘根目录。
TYPE MDSYS.SDO_GEOMETRY
1.3OTT语法如下:可以打入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.typ的目录,生成的文件就在这个目录。
2.生成sdo.h(.cpp),map.h(.cpp)
map类是用来注册sql的,否则会提示:
ORA-32162:读/写SQL的方法未注册
注册的方法是在连接数据库前加上一句:
CMap(pEnv);
低版本用:RegisterClasses(pEnv);
3.读SDO_GEOMETRY
CSdo *pSdo = (CSdo *)rs->getObject(1);
select shape from table
sdo_point里保存的是Number类型的数据。
可以用float f = float(number);
4.写SDO_GEOMETRY
可以直接用sql语句:
update tlbtest set shape=MDSYS.SDO_GEOMETRY(3003,
NULL,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(100,200))
也可以构建
CSdo sdo;
stmt->setObject(sdo);
这次博文写得太粗糙,这不是我的风格,家里没安装oracle
凭印象记下来,费了好大劲得来这些经验。
参考:
用OTT翻译Oracle Spatial中的类型

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编程了。

VS2005中用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,编译运行,问题解决!

 

posted @ 2012-11-30 20:20  大气象  阅读(2221)  评论(0编辑  收藏  举报
http://www.tianqiweiqi.com