📄 translate.cpp
字号:
// Translate.cpp: implementation of the CTranslate class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SvfToGeoMedia.h"
#include "Translate.h"
#include <map>
using namespace std;
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern void SendMsg(CString str);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CTranslate::CTranslate():m_strDbType(""),m_strAccess(""),m_strUser("")
,m_strPassWord(""),m_strDataBase(""),m_strSvfFile(""),m_strDB("")
{
m_pSvf=NULL;
m_pevent= NULL;
//全局数据库连接
m_pADOConn = NULL;
//全局地理数据库连接
m_ptrDVIConnection =NULL;
//全局数据存储服务
m_ptrGSS =NULL;
}
CTranslate::~CTranslate()
{
if (m_pSvf!=NULL)
{
try
{
if (m_pSvf->GetStatus())
m_pSvf->Close();
}catch (_com_error e)
{
AfxMessageBox(e.Description());
}
}
}
//初始化环境
bool CTranslate::Init()
{
//首先确保文件系统完成
/*
CFile file;
if (!file.Open("DataConv.mdb",CFile::modeRead))
{
AfxMessageBox("文件DataConv.mdb不存在!");
return false;
}
else
{
file.Close();
}
*/
//清理对象列表
list<CGeoObj*>::iterator item;
for( item = m_GEOList.begin();item!= m_GEOList.end();item++)
{
CGeoObj* pGeoObj = *item;
delete pGeoObj;
}
m_GEOList.clear();
char szFile[500];
GetModuleFileName(NULL,szFile,_MAX_PATH);
char szDriver[_MAX_DRIVE];
char szDir[_MAX_DIR];
_splitpath(szFile,szDriver,szDir,NULL,NULL);
CString strDriver(szDriver);
CString strDir(szDir);
CString strfilename = strDriver+strDir+"\DataConv.mdb";
//创建Access数据库连接
if (m_pADOConn==NULL) m_pADOConn= new ADOConn;
if (!m_pADOConn->m_bConnect)
{
if (!m_pADOConn->OnInitADOAcess(strfilename))
{
AfxMessageBox("连接Access数据库DatConv.mdb失败!");
return false;
}
}
//得到数据集对象
//_bstr_t vSQL = "Select * from SvfToGeoMedia";
//m_pSvf = m_pADOConn->GetRecordSet(vSQL);
//初始化地理据库连接
//if (G_ptrDVIConnection!=NULL)
//{
//try
//{
// G_ptrDVIConnection->Disconnect();
//}
//catch (...) {
//}
m_bInit=true;
return true;
}
bool CTranslate::Translate()
{
//若没有初始化先初始化
SendMsg("SVF转换到GeoMedia工作开始!");
if (!Init())
{
AfxMessageBox("初始化过程中出现错误!");
return false;
}
//读取SVF文件形成地理对象
SendMsg("开始读取"+m_strSvfFile+"文件!");
try
{
m_svfReadFile.SetParam(&m_GEOList);
m_svfReadFile.ReadFile(m_strSvfFile);
}catch (CException* e)
{
e->Delete();
SendMsg("读"+m_strSvfFile+"文件过程中遇到意外错误!");
AfxMessageBox("读"+m_strSvfFile+"文件过程中遇到意外错误!") ;
return false;
}
SendMsg("读文件"+m_strSvfFile+"完成!");
//检查系统配置是否完备
SendMsg("开始检查SVF代码与目标表关联是否完整!");
//得到所有地理对象地理数据表名
list<CGeoObj*>::iterator item;
for( item = m_GEOList.begin();item!= m_GEOList.end();item++)
{
if (WaitForSingleObject(m_pevent->m_hObject,0)== WAIT_OBJECT_0)
{
return false;
}
CGeoObj* pGeoObj = *item;
try
{
pGeoObj->SetParam(m_pADOConn,m_ptrDVIConnection,m_ptrGSS);
pGeoObj->GetTableName();
}catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
//检查是否所有地理对象都有对象的地理表
map<CString,bool> geoCodemap;
for(item = m_GEOList.begin();item!= m_GEOList.end();item++)
{
if (WaitForSingleObject(m_pevent->m_hObject,0)== WAIT_OBJECT_0)
{
return false;
}
CGeoObj* pGeoObj = *item;
if (pGeoObj->m_strTable=="")
{
geoCodemap[pGeoObj->m_strGeoCode.c_str()]=false;
}
}
for(map<CString,bool>::iterator TbItem = geoCodemap.begin();TbItem!= geoCodemap.end();TbItem++)
{
CString strGeoCode = TbItem->first;
SendMsg("SVF代码"+strGeoCode+"没有对应的数据表,请配置相关对照表!");
}
if (geoCodemap.size()>0)
return false;
SendMsg("文件中所有的SVF代码均配置完整!");
//检查表是否都存在
SendMsg("检查目标库中元数据的完备性!");
if (!CheckTbExists())
{
AfxMessageBox("请先创建SVF代码对应的相关表!");
return false;
}
SendMsg("文件中所有的SVF对象在目标库中都有元数据!");
//连接地理数据库
if (!InitGeoDbConnect())
{
AfxMessageBox("GeoMedia连接数据库失败!");
return false;
}
//把地理对象列表中的对象写到数据库
SendMsg("开始转换地理对象!");
for(item = m_GEOList.begin();item!= m_GEOList.end();item++)
{
if (WaitForSingleObject(m_pevent->m_hObject,0)== WAIT_OBJECT_0)
{
return false;
}
CGeoObj* pGeoObj = *item;
try
{
//pGeoObj->SetParam(m_pADOConn,m_ptrDVIConnection,m_ptrGSS);
//pGeoObj->WriteGeoObjToDataBase();
WriteGeoObjToDb(pGeoObj);
CString strID;
strID.Format("%d",pGeoObj->m_nID);
CString strMsg= "转换SVF";
CString strCode (pGeoObj->m_strGeoCode.c_str());
strMsg += strCode;
strMsg+= "到目标表"+pGeoObj->m_strTable+",ID "+strID;
SendMsg(strMsg);
}catch (_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
//关闭地理数据库连接
m_ptrDVIConnection->Disconnect();
SendMsg("转换完成!");
AfxMessageBox("转换完成!");
return true;
}
//从数据库中删除地理对象集合
bool CTranslate::DelGeoObj()
{
//关闭地理数据连接
try
{
m_ptrDVIConnection->Disconnect();
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
}
//建立ADOCON数据库连接
ADOConn* pADOConn = new ADOConn;
m_strDbType.MakeUpper();
if (m_strDbType=="ACCESS")
{
pADOConn->OnInitADOAcess(m_strAccess);
}else if (m_strDbType == "ORACLE")
{
pADOConn->OnInitADOConnOra(m_strUser,m_strPassWord,m_strDataBase);
}else if (m_strDbType == "SQLSERVER")
{
pADOConn->OnInitADOConn(m_strUser,m_strPassWord,m_strDataBase,m_strDB);
}
CString strSQL;
list<CGeoObj*>::iterator item;
for(item = m_GEOList.begin();item!=m_GEOList.end();item++)
{
CGeoObj* pGeoObj = *item;
CString strtable = pGeoObj->m_strTable;
CString strID;
if (pGeoObj->m_nID>0)
{
strID.Format("%d",pGeoObj->m_nID);
strSQL = "Delete from "+ strtable+ "where ID="+strID;
pADOConn->ExecuteSQL(_bstr_t(strSQL));
CString strID;
strID.Format("%d",pGeoObj->m_nID);
CString strMsg = "回退SVF";
CString strCode(pGeoObj->m_strGeoCode.c_str());
strMsg+= ",表"+pGeoObj->m_strTable+"ID "+strID;
SendMsg(strMsg);
}
}
for(item= m_GEOList.begin();item!= m_GEOList.end();item++)
{
CGeoObj* pGeoObj = *item;
delete pGeoObj;
}
m_GEOList.clear();
return true;
}
//检查表是否存在
bool CTranslate::CheckTbExists()
{
ADOConn* pADOConn=new ADOConn;
m_strDbType.MakeUpper();
if(m_strDbType=="ACCESS")
{
if (!pADOConn->OnInitADOAcess(m_strAccess))
{
AfxMessageBox("连接"+m_strAccess+"失败!");
return false;
}
}
else if (m_strDbType=="ORACLE")
{
if (!pADOConn->OnInitADOConnOra(m_strUser,m_strPassWord,m_strDataBase))
{
AfxMessageBox("连接"+m_strDataBase+"数据库失败!");
return false;
}
} else if (m_strDbType=="SQLSERVER")
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -