汪斌
?
基于Oracle Spatial空間數(shù)據(jù)庫數(shù)據(jù)的動(dòng)態(tài)讀取
汪斌
(安徽省測繪產(chǎn)品質(zhì)量監(jiān)督檢驗(yàn)站 安徽合肥 230031)
首先介紹了利用VC++6.0開發(fā)基于Oracle實(shí)現(xiàn)對(duì)數(shù)據(jù)庫數(shù)據(jù)動(dòng)態(tài)讀取的必要性,并給出了獲取空間數(shù)據(jù)表的方法以及相應(yīng)的主要程序代碼;在分析了讀取Oracle中空間數(shù)據(jù)原理的基礎(chǔ)上,對(duì)實(shí)現(xiàn)的代碼給予說明。
空間數(shù)據(jù)庫 Oracle Spatial 動(dòng)態(tài)讀取
由于每次連接Oracle數(shù)據(jù)庫同時(shí)只能讀取一個(gè)數(shù)據(jù)表的情況,本文實(shí)現(xiàn)了一次連接數(shù)據(jù)庫時(shí),能同時(shí)讀取多個(gè)數(shù)據(jù)表文件的方法,實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫數(shù)據(jù)的動(dòng)態(tài)讀取,是深層次開發(fā)地理信息系統(tǒng)的基礎(chǔ)。由于VC++具有運(yùn)行效率高、可實(shí)現(xiàn)底層開發(fā)以及特別適合寫系統(tǒng)軟件的特點(diǎn),對(duì)于開發(fā)空間信息管理系統(tǒng)具有較大優(yōu)勢。本文利用VC++6.0與MapX集成二次開發(fā)的方法,實(shí)現(xiàn)了Oracle空間數(shù)據(jù)庫中表的動(dòng)態(tài)讀取操作。
Oracle提供了一系列對(duì)空間數(shù)據(jù)表訪問與操作的工具,例如SQL Plus、OCI以及OO4O等方法。SQL Plus是Oracle數(shù)據(jù)庫提供的訪問數(shù)據(jù)庫的重要工具,可方便地實(shí)現(xiàn)對(duì)數(shù)據(jù)庫表的訪問,但是其無法與其他通用的開發(fā)語言集成使用。OCI由Oracle公司提供的頭文件和庫函數(shù)等組成的一個(gè)訪問Oracle數(shù)據(jù)庫的應(yīng)用程序編程接口,其對(duì)于編程人員的要求水平也較高。OO4O則提供了對(duì)基礎(chǔ)OCI庫函數(shù)的封裝,而且對(duì)于動(dòng)態(tài)獲取Oracle空間數(shù)據(jù)表的信息易于實(shí)現(xiàn)。本文通過OO4O實(shí)現(xiàn)Oracle空間數(shù)據(jù)庫表信息的獲取。
2.1 OO4O開發(fā)環(huán)境的配置
OO4O提供了連接數(shù)據(jù)庫功能的類ODatabase以及相關(guān)記錄集、字段、異常處理的類。在VC++6.0中包含OO4O對(duì)應(yīng)的頭文件、類庫和動(dòng)態(tài)庫文件,構(gòu)建運(yùn)行環(huán)境,具體包括動(dòng)態(tài)庫DLL文件ORACLM32.DLL,動(dòng)態(tài)庫LIB文件ORACLM32.LIB以及VC++的頭文件Obound.h、Omfc.h、Oracl.h文件[1]。首先選擇VC++6.0的“工程”中的“設(shè)置”菜單項(xiàng),在“連接”選項(xiàng)卡的“對(duì)象/庫模塊”中包括ORACLM32.LIB,然后在“工具”中的“選項(xiàng)”菜單項(xiàng),在“目錄”選項(xiàng)中包含相應(yīng)的頭文件和庫文件。
2.2 打開數(shù)據(jù)庫連接
在訪問Oracle數(shù)據(jù)庫之前,必須建立與數(shù)據(jù)庫的連接??梢栽趹?yīng)用程序初始化的時(shí)候建立連接。利用OStartup()啟動(dòng)ORACLE數(shù)據(jù)庫的服務(wù),然后,利用Open (數(shù)據(jù)庫名,用戶名,關(guān)鍵字)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的打開。具體代碼如下:
OStartup();
ODatabase m_OraDB;
CDBLoginDlg dlg;
if(dlg.DoModal ()==IDOK)
{
//打開數(shù)據(jù)庫
m_OraDB.Open(dlg.m_strDBName,dlg.m_strUserName ,dlg.m_strPasswordName);
if(!m_OraDB.IsOpen ())
{
AfxMessageBox("數(shù)據(jù)庫未打開!");
return FALSE;
}
}
return TRUE;
2.3 獲取空間數(shù)據(jù)庫表名
空間數(shù)據(jù)表名的信息可以在“USER_TABLES”的數(shù)據(jù)庫視圖中獲取。在“USER_TABLES”表中存儲(chǔ)了如下相關(guān)信息:
Table USER_TABLES(TABLE_NAME,TABLENAME_SPACE,CLUSTER_NAME,……DEPENDENCIES);
通過如下代碼實(shí)現(xiàn)對(duì)數(shù)據(jù)庫表信息的獲?。?/p>
//打開數(shù)據(jù)表
ODynaset m_Oraset;
m_Oraset.Open(m_OraDB,"select * from USER_TABLES");
if(!m_Oraset.IsOpen())
{
AfxMessageBox(m_Oraset.GetErrorText());
return "Error";
}
OValue val;
while(!m_Oraset.IsEOF())
{
m_Oraset.GetFieldValue((const char *)"TABLE_NAME",&val);
arrTableName->Add (CString((const char *)val));
m_Oraset.MoveNext();
}
m_Oraset.Close();
空間數(shù)據(jù)庫的連接與讀取,是采用VC++6.0與MapX集成的方式實(shí)現(xiàn)。首先要在新建的VC++工程中,創(chuàng)建MapX控件,包含MapX.cpp和MapX.h文件,然后在視類中加入MapX對(duì)象的頭文件,為MapX創(chuàng)建一個(gè)資源ID,最后通過類向?qū)?duì)于WM_CREATE、WM_SIZE和WM_SETFOCUS實(shí)現(xiàn)對(duì)應(yīng)得消息相應(yīng)[3]。在Oracle數(shù)據(jù)庫中,對(duì)于空間數(shù)據(jù)的管理是通過Oracle Spatial的組件實(shí)現(xiàn)的;而MapX通過Oracle的OCI(Oracle Call Interface)接口來訪問Oracle Spatial,通過LayerInfo完成圖層的加載。主要的代碼如下:
n=m_DatabaseName.GetCurSel ();//獲取數(shù)據(jù)庫名
m_DatabaseName.GetLBText (n,str); //創(chuàng)建連接字符串
ConnectStr="SRVR="+str+";UID="+m_Username+";PWD="+m_Password;
try { layers=m_ctrlMapx.GetLayers ();
CMapXLayerInfo layerinfo;
if(layerinfo.CreateDispatch (layerinfo.GetClsid ()))
{
CDialoadownload download;
download.DoModal ();
str_Convey=download.str_downtable ;
}
layerinfo.SetType (miLayerInfoTypeServer);
VARIANT varName; varConnectStr; varQuery; varToolKits;
//讀取表的SQL語句
strQuery.Format ("Select * From %s",str_Convey);
CString strToolKits="ORAINET";
varName.vt=VT_BSTR;
varName.bstrVal =strName.AllocSysString ();
varConnectStr.vt=VT_BSTR;
varConnectStr.bstrVal =ConnectStr.AllocSysString ();
varQuery.vt=VT_BSTR;
varQuery.bstrVal =strQuery.AllocSysString ();
varToolKits.vt =VT_BSTR;
varToolKits.bstrVal =strToolKits.AllocSysString ();
layerinfo.AddParameter ("Name",varName);
layerinfo.AddParameter ("ConnectString",varConnectStr);
layerinfo.AddParameter ("Query",varQuery);
layerinfo.AddParameter ("ToolKit",varToolKits);
Newlayer=layers.Add (layerinfo,0); }//應(yīng)用程序中加載相應(yīng)得圖層
基于VC++6.0動(dòng)態(tài)讀取Oracle數(shù)據(jù)庫不僅效率高,而且利用VC++的強(qiáng)大功能,可以實(shí)現(xiàn)空間數(shù)據(jù)庫管理系統(tǒng)的深層次開發(fā)。我們可以在此基礎(chǔ)上開發(fā)相應(yīng)的空間數(shù)據(jù)庫管理系統(tǒng)及相關(guān)的應(yīng)用程序。
[1] 《電腦編程技巧與維護(hù)》雜志社.Visual C++編程技巧典型案例解析[M].北京:中國電力出版社,2005.
[2] 新電腦課堂—Visual C++編程篇[M].北京:電子工業(yè)出版社,2004.
[3] 齊銳,屈韶琳,陽琳斌.用MAPX開發(fā)地理信息系統(tǒng)[M].北京:清華大學(xué)出版社,2003.
[4] 陳建春.Visual C++開發(fā)GIS系統(tǒng)(第2版)[M].北京:電子工業(yè)出版社,2004.