国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Oracle Spatial空間數(shù)據(jù)庫數(shù)據(jù)的動(dòng)態(tài)讀取

2015-03-02 02:25汪斌
測繪技術(shù)裝備 2015年3期
關(guān)鍵詞:數(shù)據(jù)表應(yīng)用程序編程

汪斌

?

基于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)讀取

1 引言

由于每次連接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)讀取操作。

2 空間數(shù)據(jù)庫表信息的獲取

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();

3 空間數(shù)據(jù)庫的讀取

空間數(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)得圖層

4 結(jié)束語

基于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.

猜你喜歡
數(shù)據(jù)表應(yīng)用程序編程
編程,是一種態(tài)度
元征X-431實(shí)測:奔馳發(fā)動(dòng)機(jī)編程
編程小能手
湖北省新冠肺炎疫情數(shù)據(jù)表(2.26-3.25)
湖北省新冠肺炎疫情數(shù)據(jù)表
紡織機(jī)上誕生的編程
刪除Win10中自帶的應(yīng)用程序
基于列控工程數(shù)據(jù)表建立線路拓?fù)潢P(guān)系的研究
谷歌禁止加密貨幣應(yīng)用程序
圖表