⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 translate.cpp

📁 GemoMedia 应用 演示了其使用方法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -