先贴上主要的代码CString s_str[] = {"FIELD1","FIELD2","FIELD3","FIELD4","FIELD5",
"FIELD6","FIELD7","FIELD8","FIELD9","FIELD10",
"FIELD11","FIELD12","FIELD13","FIELD14","FIELD15",
"FIELD16"}; CString strTime;
CTime t = CTime::GetCurrentTime();
pRecordData->RecordTime = t;
strTime.Format("%d",t); //当数据库为空,就新建一行
 if(m_pRecordset->BOF&&m_pRecordset->adoEOF)
{
m_pRecordset->AddNew();
stnDataFiled = 0;
m_pRecordset->PutCollect("TIMEINDEX",_variant_t(strTime));
m_pRecordset->PutCollect("DATEINDEX",_variant_t(t.Format("%Y-%m-%d")));

} for(int nAddrIndex =1; nAddrIndex <= 2; nAddrIndex++)  
{
pRecordData->MeterAddress = nAddrIndex;
pRecordData->AlarmIndex = 0;//报警功能
for(int nChannelIndex = 0;nChannelIndex < 4;nChannelIndex++)
{
pRecordData->PresentValue = float(m_nCurPV[nChannelIndex][nAddrIndex])/(float)10.0;
pRecordData->ChannelCode = nChannelIndex + 1;

//数据存储单元序号(0~15小于数据单元数16
                                      //nfiledamout为每行最大的存储各数=16
if(stnDataFiled >= nfiledamount)
{
m_pRecordset->AddNew();
stnDataFiled = 0;
m_pRecordset->PutCollect("TIMEINDEX",_variant_t(strTime));
m_pRecordset->PutCollect("DATEINDEX",_variant_t(t.Format("%Y-%m-d")));

}
//数据库内存储数据的格式
//数据记录时间,仪表地址,通道号,实时数据,报警序号
strData.Format("%d,%d,%d,%g,%d",
pRecordData->RecordTime,
pRecordData->MeterAddress,
pRecordData->ChannelCode,
pRecordData->PresentValue,
pRecordData->AlarmIndex); m_pRecordset->PutCollect(_variant_t(s_str[stnDataFiled]),_variant_t(strData));

                stnDataFiled++;
}
}
}
if(!(m_pRecordset->BOF && m_pRecordset->adoEOF))// 这里出错,当第一行还未写满,不用换行时,不会出错
    {                              //当第1行满,if(stnDataFiled >= nfiledamount).ADDNEW()后再次写入数据,就出错
m_pRecordset->Update(); 
    }
delete pRecordData;
    m_pRecordset->Close();
m_pRecordset.Release();
m_pRecordset = NULL;

if(m_pConnection->State)
    m_pConnection->Close();
m_pConnection= NULL;  
bResult = TRUE; return bResult;上面是详细的代码,主要是想数据库写入 时间,仪表地址,通道号,实时数据,报警序 格式的数据每次写入为8个数据,  每一行能存放16个现在前2次写入,然后调用UPDATA,数据都能正常写入由于当数据大于16个时,需要行换继续写入,用ADDNEW()增一行.然后到再写入后,调用UPDATA就出现错误了,

解决方案 »

  1.   

    加异常捕获看是什么错误
    try
    {
    //你的ADO代码
    }
    catch (_com_error& e)
    {
    CString strMsg;
    strMsg.Format(_T("错误描述:%s\n错误消息%s", 
    (LPCTSTR)e.Description(),
    (LPCTSTR)e.ErrorMessage());
    AfxMessageBox(strMsg);
    }
      

  2.   

    代码很乱,怎么有多处m_pRecordset->AddNew()!记住:AddNew()和Update()是成对使用的,你一次添加一条记录,
    把数据库需要赋值的都要PutCollect,不要一次条件多条记录!
      

  3.   

    强烈建议对于数据的增加、修改、删除不要用ADO自带那那ADDNew 呀什么的去控制。
    要用SQL增控制。这是最好的,而且对于后续的扩展、维护都是有帮助的。VC对ADO操作的例子在我的BLOG里有:http://blog.csdn.net/zhongguoren666/article/details/6701403
    这个是我在正式上线环境下用的。绝对可用的。
      

  4.   

    记住:AddNew()和Update()是成对使用的,你一次添加一条记录,
    把数据库需要赋值的都要PutCollect,不要一次条件多条记录!