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

📄 data_transdlg.cpp

📁 mcgs的数据导出源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			
			if (m_iStep+10<100)
				m_iStep += 10;
		}
		//进行数据的分析,并把分析的数据保存到对应的文件中
		{
			int iNum = 0;
			switch(iType)
			{
			case 0:
				iNum = mfSaveToFile(m_strFileName ,listValueBuffer,timeEnd);
				break;
			case 1:
				iNum = mfSaveToDatabase(DataName,listValueBuffer,timeEnd,iPos);
				break;
			default:
				break;
			}
			if (iNum <0)
			{
				for ( i = 0; i < ARRAYSIZE ( listValueBuffer); i++ )	//分配保存的空间
				{
					delete listValueBuffer[i] ;
				}
				return -1;
			}
			if (listValueBuffer[0]->GetCount()<m_iRequiredRecords)
			{
				if (m_iStep+30<100 )
					m_iStep = 95;
			}
			else
			{				
				if (m_iStep+10<100 )
					m_iStep += 10;
			}
			iSumNun += iNum;
			if (iNum < m_iRequiredRecords)	//查询结束
			{
				m_RemoveFirst = false;
				//推出循环
				if (iNum <0)
				{
					return -4;
				}
				
				for ( i = 0; i < ARRAYSIZE ( listValueBuffer); i++ )	//分配保存的空间
				{
					delete listValueBuffer[i] ;
				}
				m_iStep = 100;
				m_ctrlprocess.SetPos(m_iStep);
				if (m_pDBSave != NULL && m_pDBSave->IsOpen())
				{
					m_pDBSave->Close() ;

				}
				break;			
			}
			else
			{
				m_RemoveFirst = true;	//除去查询的第一条数据
			}
			//这种情况主要是往下查找,故只要用最后的数据作为参考就行
			if (m_iDesOrder == 0)		
			{
				timeBegin = timeEnd;	//修改了查询时间
				timeEnd = endTime;	//把最后的时间恢复
			}
			
			for ( i = 0; i < ARRAYSIZE ( listValueBuffer); i++ )	//分配保存的空间
			{
				delete listValueBuffer[i] ;
			}
		}
	}
	m_iRequiredRecords = CVirtualInfoFile::m_iTotalReadRecords;
	//	XZQ	2003.12.26
	//	清除表达式
	CVirtualSaveFileBlock::m_arrayRunCode.RemoveAll();
	ASSERT(CVirtualSaveFileBlock::m_arrayRunCode.GetSize()  == 0);
	return iSumNun;
}

//把数组listValueBuffer的信息保存在文件FileName中penghong add
//1。对应的文件名,2。对应的要保存的信息3,传递最后一条的时间penghong add
//返回值:0表示没有数据,>0表示一共多少条数据
int CData_TransDlg::mfSaveToFile(CString &FileName,CArray<CList<COleVariant,COleVariant>*,CList<COleVariant,COleVariant>*> &listValueBuffer,COleDateTime &endTime)
{
	CFile file;	
	try
	{
		//打开文件,如果文件不存在则创建此文件,用处是清空文件
		if (!file.Open(FileName , CFile::modeWrite))
		{
			
			return -4;
		}
	}
	catch(...)
	{
		return -1;
	}

	CArray<CSaveDataValue,CSaveDataValue> aryValue;	//保存成另一种信息的格式,以数组的方式好进行统计功能
	int iFillCount = listValueBuffer[0] -> GetCount();
	if (iFillCount <=0)
		return iFillCount ;
	int iCols = listValueBuffer.GetSize();//保存对应的字段数
	aryValue.SetSize(iFillCount );
	for (int k = 0 ; k < listValueBuffer.GetSize(); k ++)
	{	
		POSITION pos = NULL;
		
		pos = listValueBuffer[k]->GetHeadPosition();
		
		for (int i=0; i<iFillCount;++i)
		{
			COleVariant v;
			
			aryValue[i].m_ValueArray.SetSize(iCols);
			v = listValueBuffer[k]->GetNext(pos);
			if (v.vt == VT_BSTR)
			{
				CString s = v.bstrVal;
				aryValue[i].m_ValueArray[k] = s;
			}
			else
			{
				aryValue[i].m_ValueArray[k] = v;
			}
		}
	}
	int i=0;
	if (m_RemoveFirst)
		i =1;
	for (; i<iFillCount; ++i)
	{
		CString strRow;	//保存一行信息
		for (int j=0; j<listValueBuffer.GetSize();++j)
		{
			switch(aryValue[i].m_ValueArray[j].vt)
			{
			case VT_BSTR:
				{
					
					CString str;
					str = aryValue[i].m_ValueArray[j].bstrVal;
					int iRet = str.Find(',',0);
					if (iRet != -1)
						str = "\""+str + "\"";
					strRow += str;
				}
				break;
			case VT_R4:	//浮点型
				{
					
					float f = aryValue[i].m_ValueArray[j].fltVal;
					CString str;
					str.Format(_T("%f"),f);
					strRow += str;				
				}
				break;
			case VT_I4:
				{
					int iValue = aryValue[i].m_ValueArray[j].lVal;
					CString str;
					str.Format(_T("%d"),iValue);
					strRow += str;				
				}
				break;
			case VT_DATE:	//时间型转换趁个字符型
				{
					COleDateTime vTmp;
					vTmp = aryValue[i].m_ValueArray[j];
					CString str;
					str.Format(_T("%d-%d-%d %d:%d:%d"),vTmp.GetYear(),vTmp.GetMonth(),vTmp.GetDay(),vTmp.GetHour(),vTmp.GetMinute(),vTmp.GetSecond());
					strRow += str;						
				}
				break;
			default:
				{
					ASSERT(FALSE);
					return -1;
				}
			}
			if (j != listValueBuffer.GetSize()-1)
				strRow += ",";
		}
		strRow += _T("\r");//这个是换页的情况penghong add
		strRow += _T("\n");
		
#ifdef MCGS_WCE_EMU
		TRY
#endif
		{
			int a = file.SeekToEnd();
			
#ifdef _UNICODE 
			
			int nUTF8Len = WideCharToMultiByte(CP_UTF8,0,strRow,strRow.GetLength(),NULL,0,NULL,NULL);
			char* pBuffer  = NULL;
			pBuffer = new char[nUTF8Len+1];
			int nLength = WideCharToMultiByte(CP_UTF8,0,strRow,strRow.GetLength(),pBuffer,nUTF8Len+1,NULL,NULL);
			file.Write( pBuffer, nLength );
			delete pBuffer;
			pBuffer = NULL;
			
#else
			file.Write((LPCTSTR)strRow,strRow.GetLength());
#endif//#ifdef _UNICODE
		}
#ifdef MCGS_WCE_EMU
		CATCH(CFileException,e)
		{
			file.Close();
			return -1;	//写文件失败
		}
		END_CATCH
#endif
	}
	file.Close();
	endTime = aryValue[iFillCount-1].m_ValueArray[0];	//修改最后查询的时间
	return iFillCount;	//返回查询的条数
}

//把查询的数据保存到数据库1。对应的要保存的信息2,传递最后一条的时间penghong add
//返回值:0表示没有数据,>0表示一共多少条数据
int CData_TransDlg::mfSaveToDatabase(CString &DateName,CArray<CList<COleVariant,COleVariant>*,CList<COleVariant,COleVariant>*> &listValueBuffer,COleDateTime &endTime,int iPos)
{
	int iFillCount=0;
	{
		CDaoTableDef* pDef = NULL;
		CDaoRecordset theSet(m_pDBSave);
		if (!m_pTableDef.Lookup(DateName,pDef))
			return -1;
		try
		{
			if (!pDef->IsOpen())
				pDef->Open(DateName);
			theSet.Open(pDef,dbOpenDynaset,dbAppendOnly);
		//	theSet.Open(pDef);
			return mfAddDatetoDatabase(theSet,listValueBuffer,endTime);	
		}
		catch(CException* e)
		{
			e->Delete();
			return -1;
		}
	}
	return iFillCount;
}

CDaoTableDef* CData_TransDlg::SvrCreateTable(int iPos,CString &DateName,TABLESTRUCT &pDef)
{
	try
	{	//创建表
		//产生表
		CDaoTableDef* ptableDef = new CDaoTableDef(m_pDBSave);
		ptableDef->Create(DateName);
		for (int i=0;i<pDef.name.GetSize();i++)
		{					  
			CDaoFieldInfo fieldinfo ;
			fieldinfo.m_strName = _T(pDef.name[i]);           // Primary
			fieldinfo.m_nType = pDef.type[i];               // Primary
			fieldinfo.m_bAllowZeroLength = FALSE;     // Secondary
			fieldinfo.m_lAttributes = dbUpdatableField;  // Primary
			switch (pDef.type[i])
			{
			case dbSingle:
				fieldinfo.m_lSize = 4;
				break;
			case dbLong:
				fieldinfo.m_lSize = 4;
				break;
			case dbDate:
				fieldinfo.m_lSize = 8;
				break;
			case dbText:
				fieldinfo.m_lAttributes = dbUpdatableField;  // Primary
				fieldinfo.m_lSize = 64;         // Primary
				fieldinfo.m_bAllowZeroLength = TRUE;     // Secondary
				break;
			case dbMemo:
				fieldinfo.m_bAllowZeroLength = TRUE;     // Secondary
				fieldinfo.m_lSize = 0;         // Primary
				break;
			default:
				fieldinfo.m_lSize = 0;         // Primary
				break;
			}			
			fieldinfo.m_nOrdinalPosition = 0;    // Secondary
			fieldinfo.m_bRequired = FALSE;            // Secondary			
			fieldinfo.m_lCollatingOrder = 0;      // Secondary
			ptableDef->CreateField(fieldinfo);
			
		}
		CDaoIndexInfo d;
#ifdef NOT_WWW_MCGSRUN //SQL数据库必须有一列是有区别的
		d.m_bIgnoreNulls = false;		
		d.m_bClustered = false;
		d.m_bRequired = true;
		d.m_bForeign = false;
		d.m_bPrimary = false;
		d.m_bUnique = false;		
#endif
		//建立索引机制
		d.m_strName = pDef.name[0] + "_INDEX";
		d.m_nFields = 1;
		CDaoIndexFieldInfo fd;
		fd.m_strName = pDef.name[0];
		fd.m_bDescending = false;
		d.m_pFieldInfos = &fd;
		ptableDef->CreateIndex (d);
		ptableDef->Append();		
		m_pTableDef.SetAt(DateName,ptableDef);	
		return ptableDef;
	}
	catch(CException* e)
	{
		e->Delete();
		return NULL;
	}
	return NULL;
}	

//对数据库的一些操作
int CData_TransDlg::mfQueryFromDatabase(int iPos,CString &DataName,COleDateTime &timeEnd)
{
	int iFillCount=0;
	try
	{
		if (m_pDBSave == NULL)
			m_pDBSave = new CDaoDatabase;
		if (m_pDBSave->IsOpen())
			m_pDBSave->Close();
		CString str1 = m_ConnectSql;
		if (str1.Find ("DRIVER") >= 0 && str1.Find("SQL") >= 0)
		{
			m_pDBSave->Open(NULL,0,0,m_ConnectSql);
		}
		else
		{
			m_pDBSave->Open(m_ConnectSql);	//打开数据库
		}
	}
	catch(CException* e)
	{
		e->Delete();
		return -1;
	}

	CStringArray NameArray;
	int iSize = m_pDBSave->GetTableDefCount();
	for (int i = 0 ; i < iSize; i ++)
	{
		CDaoTableDefInfo info;
		m_pDBSave->GetTableDefInfo (i,info);
		NameArray.Add(info.m_strName);
	}
	bool bTrue = false;
	switch(m_databaseType)	//
	{
	case 0:
		{
			CString dateName = "dbo." + DataName;	//针对sql和access的不同要做些处理
			for (i=0;i<NameArray.GetSize();++i)
			{
				if (NameArray[i].CompareNoCase(dateName)==0)
				{
					bTrue = true;
					break;
				}
			}		
			break;
		}
	case 1:
		for (i=0;i<NameArray.GetSize();++i)
		{
			if (NameArray[i].CompareNoCase(DataName)==0)
			{
				bTrue = true;
				break;
			}
		}
		break;
	default:
		break;
	}

	//把组对象的对象类型转换
	TABLESTRUCT pDef;
	//添加了毫秒和秒字段
	{	//针对组对象而进行设置
		//pDef.name.Add("MCGS_Time");
		pDef.name.Add("BECCA_Time");
		pDef.type.Add(dbDate);	
		pDef.length.Add(0);
		pDef.name.Add("BECCA_TimeMS");	
		pDef.type.Add(dbLong);	
		pDef.length.Add(0);

		try
		{
			for (int i=2;i<m_arrayInfoFile[iPos]->m_GrpObjInfo.GetSize();i++)
			{
				pDef.name.Add(m_arrayInfoFile[iPos]->m_GrpObjInfo[i].m_name);
				
				switch (m_arrayInfoFile[iPos]->m_GrpObjInfo[i].m_type)
				{
				case VSINGLE:
					{	
						pDef.type.Add(dbSingle);							
						pDef.length.Add(0);
					}
					break;
				case VINTEGER:
					{
						pDef.type.Add(dbLong);
						pDef.length.Add(0);
					}
					break;
				case VEVENT:
					{
						pDef.type.Add(dbText);
						pDef.length.Add(32);
					}
					break;
				case VSTRING:
					{
						{
							pDef.type.Add(dbText);
							pDef.length.Add(64);
						}
					}
					break;
				default:
					{
						ASSERT(FALSE);
						continue;
					}
				}						
			}				
		}
		catch(CException* e)
		{
			//e->ReportError();
			e->Delete();
			return -1;
		}
	}
	
	if (!bTrue )	//创建一个表
	{
		SvrCreateTable(iPos,DataName,pDef);	
	}
	else	//进行数据的操作
	{
		CDaoTableDef* ptableDef = NULL;
		try
		{		
			ptableDef = new CDaoTableDef(m_pDBSave);
			ptableDef->Open(DataName);
			for (int io = 0 ; io <pDef.name.GetSize() ; io ++)
			{					
				CDaoFieldInfo Info1;
				try
				{
					ptableDef->GetFieldInfo(io,Info1);
				}
				catch (CException* e)
				{
					//正常情况,添加变量后取不到东西.
					e->Delete();
					delete ptableDef;
					ptableDef = NULL;
					break;
				}
				if ( Info1.m_strName !=	pDef.name[io]
					|| Info1.m_nType !=	pDef.type[io])
				{
					delete ptableDef;
					ptableDef = NULL;
					break;
				}
			}		
		}
		catch(CException* e)
		{
			//e->ReportError();
			e->Delete();
			ptableDef = NULL;
		}
		bool bTrue = true;
		if (NULL == ptableDef)
		{	
			m_pDBSave->DeleteTableDef (DataName);
			ptableDef = SvrCreateTable(iPos,DataName,pDef);
			bTrue = false;
		}
		if (bTrue )
		{
			CDaoTableDef *pTable = NULL; 
			if (m_pTableDef.Lookup(DataName,pTable) && pTable != NULL)
				delete pTable;
			m_pTableDef.SetAt(DataName,ptableDef);
			
			//如果是第一次操作则有种可能是原来有数据,则要进行一些查询操作
			CDaoRecordset theSet(m_pDBSave);
			//		CDaoTableDef* ptableDef = new CDaoTableDef(m_pDBSave);
			CString strSQL;
			CString strFormat;
			CString strTime;
			strFormat = "select ";
			strFormat += "[BECCA_Time]";
			strFormat += " from %s where (";
			strFormat += "[BECCA_Time]";
			strFormat += " between #%d/%d/%d %d:%d:%d# and #%d/%d/%d %d:%d:%d#) order by ";
			strFormat += "[BECCA_Time]";
			strTime.Format(strFormat,
				DataName,
				m_startTime.GetMonth(),m_startTime.GetDay(),m_startTime.GetYear(),
				m_startTime.GetHour(),m_startTime.GetMinute(),m_startTime.GetSecond(),
				m_endTime.GetMonth(),m_endTime.GetDay(),m_endTime.GetYear(),
				m_endTime.GetHour(),m_endTime.GetMinute(),m_endTime.GetSecond());

			try
			{
				theSet.Open(dbOpenDynaset,strTime);
				if (!theSet.IsBOF())
				{
					theSet.MoveLast();
					COleVariant v;
					theSet.GetFieldValue(0,v);	//得到最后一个查询的时间
					timeEnd = v;
					m_RemoveFirst = true;	//
				}
				theSet.Close();
				
			}
			catch(CException* e)
			{
				//e->ReportError();
				e->Delete();
				return -1;
			}
			
		}
	}
	
	if (m_iStep<90)
	{
		m_iStep+=10;
		m_ctrlprocess.SetPos(m_iStep);
	}

	return iFillCount;
}

int CData_TransDlg::mfAddDatetoDatabase(CDaoRecordset &theSet,CArray<CList<COleVariant,COleVariant>*,CList<COleVariant,COleVariant>*> &listValueBuffer,COleDateTime &endTime)
{
	CArray<CSaveDataValue,CSaveDataValue> aryValue;	//保存成另一种信息的格式,以数组的方式好进行统计功能
	int iFillCount = listValueBuffer[0] -> GetCount();

	if (iFillCount <=0)
		return iFillCount ;

	int iCols = listValueBuffer.GetSize();//保存对应的字段数
	aryValue.SetSize(iFillCount );
	for (int k = 0 ; k < listValueBuffer.GetSize(); k ++)
	{	
		POSITION pos = NULL;
		
		pos = listValueBuffer[k]->GetHeadPosition();
		
		for (int i=0; i<iFillCount;++i)
		{
			COleVariant v;
			
			aryValue[i].m_ValueArray.SetSize(iCols);
			v = listValueBuffer[k]->GetNext(pos);
			if (v.vt == VT_BSTR)
			{
				CString s = v.bstrVal;
				aryValue[i].m_ValueArray[k] = s;
			}
			else
			{
				aryValue[i].m_ValueArray[k] = v;
			}
		}
	}
	int i=0;
	if (m_RemoveFirst)
	{
		i=1;
		if(iFillCount==1)
			return 0;
	}
	for (; i<iFillCount; ++i)
	{
		try
		{
			
			theSet.AddNew();	//添加一行数据
			for (int j=0; j<listValueBuffer.GetSize();++j)
			{		
				switch(aryValue[i].m_ValueArray[j].vt)
				{	
				case VT_BSTR:
					{
						CString str;
						str = aryValue[i].m_ValueArray[j].bstrVal;
						theSet.SetFieldValue(j,(LPCTSTR)str);
					}
					break;
				default:
					theSet.SetFieldValue(j,aryValue[i].m_ValueArray[j]);
					break;
				}
			}
			theSet.Update();
		}
		catch(CException* e)
		{
			//e->ReportError();
			e->Delete();
		}
	}
	
	endTime = aryValue[iFillCount-1].m_ValueArray[0];	//修改最后查询的时间
	return iFillCount;
}

void CData_TransDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (m_iStep<100)
	{
		m_iStep+=1;
		m_ctrlprocess.SetPos(m_iStep);
	}
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -