OCCI读写Oracle Spatial的SDO_Geometry
在命令行下進入你intype.typ的目錄,生成的文件就在這個目錄。2.生成sdo.h(.cpp),map.h(.cpp)map類是用來注冊sql的,否則會提示:ORA-32162:讀/寫SQL的方法未注冊注冊的方法是在連接數據庫前加上一句:CMap(pEnv);低版本用:RegisterClasses(pEnv);3.讀SDO_GEOMETRYCSdo *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憑印象記下來,費了好大勁得來這些經驗。url:http://greatverve.cnblogs.com/archive/2012/11/30/occi-sdo_geometry.html參考:
用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編程了。
網上有關使用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,編譯運行,問題解決!
?
總結
以上是生活随笔為你收集整理的OCCI读写Oracle Spatial的SDO_Geometry的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中嵌入ie浏览器总结 .
- 下一篇: 兆凯综合布线系统简介