📄 data_transdlg.cpp
字号:
{
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 + -