基于Oracle Spatial空间数据库数据的动态读取
2015-03-02汪斌
汪斌
基于Oracle Spatial空间数据库数据的动态读取
汪斌
(安徽省测绘产品质量监督检验站 安徽合肥 230031)
首先介绍了利用VC++6.0开发基于Oracle实现对数据库数据动态读取的必要性,并给出了获取空间数据表的方法以及相应的主要程序代码;在分析了读取Oracle中空间数据原理的基础上,对实现的代码给予说明。
空间数据库 Oracle Spatial 动态读取
1 引言
由于每次连接Oracle数据库同时只能读取一个数据表的情况,本文实现了一次连接数据库时,能同时读取多个数据表文件的方法,实现了对数据库数据的动态读取,是深层次开发地理信息系统的基础。由于VC++具有运行效率高、可实现底层开发以及特别适合写系统软件的特点,对于开发空间信息管理系统具有较大优势。本文利用VC++6.0与MapX集成二次开发的方法,实现了Oracle空间数据库中表的动态读取操作。
2 空间数据库表信息的获取
Oracle提供了一系列对空间数据表访问与操作的工具,例如SQL Plus、OCI以及OO4O等方法。SQL Plus是Oracle数据库提供的访问数据库的重要工具,可方便地实现对数据库表的访问,但是其无法与其他通用的开发语言集成使用。OCI由Oracle公司提供的头文件和库函数等组成的一个访问Oracle数据库的应用程序编程接口,其对于编程人员的要求水平也较高。OO4O则提供了对基础OCI库函数的封装,而且对于动态获取Oracle空间数据表的信息易于实现。本文通过OO4O实现Oracle空间数据库表信息的获取。
2.1 OO4O开发环境的配置
OO4O提供了连接数据库功能的类ODatabase以及相关记录集、字段、异常处理的类。在VC++6.0中包含OO4O对应的头文件、类库和动态库文件,构建运行环境,具体包括动态库DLL文件ORACLM32.DLL,动态库LIB文件ORACLM32.LIB以及VC++的头文件Obound.h、Omfc.h、Oracl.h文件[1]。首先选择VC++6.0的“工程”中的“设置”菜单项,在“连接”选项卡的“对象/库模块”中包括ORACLM32.LIB,然后在“工具”中的“选项”菜单项,在“目录”选项中包含相应的头文件和库文件。
2.2 打开数据库连接
在访问Oracle数据库之前,必须建立与数据库的连接。可以在应用程序初始化的时候建立连接。利用OStartup()启动ORACLE数据库的服务,然后,利用Open (数据库名,用户名,关键字)实现对数据库的打开。具体代码如下:
OStartup();
ODatabase m_OraDB;
CDBLoginDlg dlg;
if(dlg.DoModal ()==IDOK)
{
//打开数据库
m_OraDB.Open(dlg.m_strDBName,dlg.m_strUserName ,dlg.m_strPasswordName);
if(!m_OraDB.IsOpen ())
{
AfxMessageBox("数据库未打开!");
return FALSE;
}
}
return TRUE;
2.3 获取空间数据库表名
空间数据表名的信息可以在“USER_TABLES”的数据库视图中获取。在“USER_TABLES”表中存储了如下相关信息:
Table USER_TABLES(TABLE_NAME,TABLENAME_SPACE,CLUSTER_NAME,……DEPENDENCIES);
通过如下代码实现对数据库表信息的获取:
//打开数据表
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 空间数据库的读取
空间数据库的连接与读取,是采用VC++6.0与MapX集成的方式实现。首先要在新建的VC++工程中,创建MapX控件,包含MapX.cpp和MapX.h文件,然后在视类中加入MapX对象的头文件,为MapX创建一个资源ID,最后通过类向导对于WM_CREATE、WM_SIZE和WM_SETFOCUS实现对应得消息相应[3]。在Oracle数据库中,对于空间数据的管理是通过Oracle Spatial的组件实现的;而MapX通过Oracle的OCI(Oracle Call Interface)接口来访问Oracle Spatial,通过LayerInfo完成图层的加载。主要的代码如下:
n=m_DatabaseName.GetCurSel ();//获取数据库名
m_DatabaseName.GetLBText (n,str); //创建连接字符串
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); }//应用程序中加载相应得图层
4 结束语
基于VC++6.0动态读取Oracle数据库不仅效率高,而且利用VC++的强大功能,可以实现空间数据库管理系统的深层次开发。我们可以在此基础上开发相应的空间数据库管理系统及相关的应用程序。
[1] 《电脑编程技巧与维护》杂志社.Visual C++编程技巧典型案例解析[M].北京:中国电力出版社,2005.
[2] 新电脑课堂—Visual C++编程篇[M].北京:电子工业出版社,2004.
[3] 齐锐,屈韶琳,阳琳斌.用MAPX开发地理信息系统[M].北京:清华大学出版社,2003.
[4] 陈建春.Visual C++开发GIS系统(第2版)[M].北京:电子工业出版社,2004.