OCCI读写Oracle Spatial的SDO_Geometry
在命令行下進(jìn)入你intype.typ的目錄,生成的文件就在這個(gè)目錄。2.生成sdo.h(.cpp),map.h(.cpp)map類(lèi)是用來(lái)注冊(cè)sql的,否則會(huì)提示:ORA-32162:讀/寫(xiě)SQL的方法未注冊(cè)注冊(cè)的方法是在連接數(shù)據(jù)庫(kù)前加上一句:CMap(pEnv);低版本用:RegisterClasses(pEnv);3.讀SDO_GEOMETRYCSdo *pSdo = (CSdo *)rs->getObject(1);select shape from table
sdo_point里保存的是Number類(lèi)型的數(shù)據(jù)。
可以用float f = float(number);4.寫(xiě)SDO_GEOMETRY可以直接用sql語(yǔ)句:update tlbtest set shape=MDSYS.SDO_GEOMETRY(3003,NULL,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),MDSYS.SDO_ORDINATE_ARRAY(100,200))也可以構(gòu)建CSdo sdo;stmt->setObject(sdo);這次博文寫(xiě)得太粗糙,這不是我的風(fēng)格,家里沒(méi)安裝oracle憑印象記下來(lái),費(fèi)了好大勁得來(lái)這些經(jīng)驗(yàn)。url:http://greatverve.cnblogs.com/archive/2012/11/30/occi-sdo_geometry.html參考:
用OTT翻譯Oracle Spatial中的類(lèi)型
OTT是Oracle數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型翻譯工具,可以把Oracle中的數(shù)據(jù)類(lèi)型翻譯為C++類(lèi)。
在使用Oracle Spatial的時(shí)候,需要通過(guò)OTT把MDSYS方案中有關(guān)空間數(shù)據(jù)結(jié)構(gòu)翻譯為C++類(lèi)。
在網(wǎng)上找了半天有關(guān)OTT使用的方法,基本上都說(shuō)的不清不楚。
沒(méi)辦法,自己看Oracle的b14294文檔——是關(guān)于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這一項(xiàng)參數(shù)可以省去。如果省去就會(huì)把user方案中的所有數(shù)據(jù)類(lèi)型都翻譯出來(lái)。
因此,可以簡(jiǎn)單自己定義一個(gè)typ文件,只把需要的幾個(gè)類(lèi)型翻譯出來(lái)就可以了。
最簡(jiǎn)單的typ文件象下面這樣就可以了:
TYPE MDSYS.SDO_GEOMETRY
TYPE MDSYS.SDO_POINT_TYPE
以上內(nèi)容用文本文件保存為spatial.typ,然后用上門(mén)的ott命令,就會(huì)生成spatial_classes.h、spatial_classes.cpp、spatial_classes_map.h、spatial_classes_map.cpp四個(gè)文件。
在vc工程中通過(guò)使用occi和這四個(gè)文件就可以進(jìn)行Oracle Spatial編程了。
網(wǎng)上有關(guān)使用OCCI訪問(wèn)Oracle Spatial的資料比較少,在用VS2005編寫(xiě)occi程序時(shí)出現(xiàn)了好幾個(gè)Oracle錯(cuò)誤,經(jīng)過(guò)在網(wǎng)上淘,總算逐個(gè)解決了。結(jié)果很簡(jiǎn)單,過(guò)程很艱難,作一個(gè)小結(jié)還是有必要的。
錯(cuò)誤1:ORA-21301:沒(méi)有按對(duì)象模式進(jìn)行初始化
原因:要用OBJECT模式初始化環(huán)境才能操作SDO_GEOMETRY空間對(duì)象
網(wǎng)上很多關(guān)于OCCI示例代碼中都是:
Environment *pEnv = Environment::createEnvironment (Environment::DEFAULT);
但是要操縱SDO_GEOMETRY空間對(duì)象,應(yīng)該用OBJECT模式:
Environment *pEnv = Environment::createEnvironment (Environment::OBJECT);
錯(cuò)誤2:ORA-32162:讀/寫(xiě)SQL的方法未注冊(cè)
原因:用ott生產(chǎn)有關(guān)oracle spatial的c++代碼時(shí),有一個(gè)class map的文件,例如spatial_classes_map.h、spatial_classes_map.cpp。這個(gè)文件里有一個(gè)RegisterClasses函數(shù),用于注冊(cè)生產(chǎn)的spatial類(lèi)(SDO_GEOMETRY等)中讀寫(xiě)SQL的方法。因此在創(chuàng)建數(shù)據(jù)庫(kù)連接之前,要進(jìn)行注冊(cè):
RegisterClasses(pEnv);
錯(cuò)誤3:OCI-22625
關(guān)于這個(gè)錯(cuò)誤,沒(méi)有給出具體信息。搜遍了百度、google、yahoo,找遍中外網(wǎng)站,唯一的答案是:這是Oracle occi的一個(gè)bug,在9201版之后已經(jīng)解決了。
暈啊,我用的vs2005、orcle 0cci for vc8 10.2.0.3。不是早就解決了嗎?折騰了一個(gè)下午,反復(fù)檢查代碼,用各種方式測(cè)試,實(shí)在沒(méi)發(fā)現(xiàn)什么問(wèn)題。后來(lái)改用release模式編譯運(yùn)行,咦,沒(méi)有出現(xiàn)這個(gè)錯(cuò)誤。然后對(duì)比檢查vs中debug和release的編譯環(huán)境,還是沒(méi)發(fā)現(xiàn)問(wèn)題,debug模式下還是出現(xiàn)這個(gè)錯(cuò)誤。
反復(fù)在網(wǎng)上找,沒(méi)有其他的信息,尋思還是應(yīng)該是oracle的bug。最后總算在oracle網(wǎng)站上發(fā)現(xiàn)occi 10.2.0.3還有兩個(gè)patch,分別是patch 10和patch 13。下載,把編譯庫(kù)改為patch 13的lib,編譯運(yùn)行,問(wèn)題解決!
?
總結(jié)
以上是生活随笔為你收集整理的OCCI读写Oracle Spatial的SDO_Geometry的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++中嵌入ie浏览器总结 .
- 下一篇: 兆凯综合布线系统简介