读书人

用过fastdb的请进!解决方法

发布时间: 2012-01-21 21:31:43 作者: rapoo

用过fastdb的请进!
CRTRecord RTRecord;
dbCursor<CAIConfigTag> curAIConf0;//只需要查询功能
if (curAIConf0.select())
{
do {
RTRecord.pszTagName = curAIConf0->pszTagName;
RTRecord.TagID = curAIConf0->TagID;
RTRecord.TagType = curAIConf0->TagType;
RTRecord.pv = curAIConf0->fDefaultPV;//所有数值初始化为0

insert(RTRecord);
} while(curAIConf0.next());
}
insert(RTRecord)这个地方出错,unhandled exception in .exe(msvcrtd.dll)。再继续往下调试,发现在dbdatabase insertrecord: dbfielddescriptor::calculateRecordsize地方弹出出错对话框。请问高手这是什么错误,应该怎样修正。用到的数据结构如下:
class CRTRecord
{
public:
//char szTagName[16];//位号的名称
char* pszTagName;//位号的名称
long TagID;//
short TagType;//用TagType确定pv值是整型浮点型还是布尔型
float pv;
char* strpv; //ysm 091106 add
char* strprepv; //ysm 091106 add
//float stdpv;//标准值0-1之间的浮点数
float pvPre;//上次采样值,提供给偏差报警和变化率报警使用
time_t lSampleTime0;//上次采样时间
time_t lSampleTime;//记录本次采样时间,两次时间差和两次采样值之差可以用来判断变化率报警

//////////////////////////////////////////////////////////////////////////
//对于模拟量输入点,量程变换是必须的
bool bTransRange;//是否量程变换,当前数据库组态程序没有保存此参数,默认为1(TRUE)
float fEuhi;//量程上限
float fEulo;//量程下限
float fPvRawLo;//裸数据上限
float fPvRawHi;//裸数据下限
short cSignalType;// Add by dovell 20090512
//////////////////////////////////////////////////////////////////////////
//增加处理报警的组态信息,不用每次判断是否报警都要查询一下位号的参数
//以AI的报警参数为基础,DI\DO的报警信息处理为对应的HiAlarm项
bool bAlarming;//保存是否在报警状态,共报警死区使用
////Alarm configure 模拟量输入的报警信息
bool bAlarmEn;//报警开关
float fAlarmDB;//报警死区
bool bHiAlarmEn;//
bool bHhAlarmEn;//
bool bLlAlarmEn;//
bool bLoAlarmEn;//
float fLlAlarmValue;//
int nLlPrio;//
float fLoAlarmValue;//
int nLoPrio;//
float fHiAlarmValue;//
int nHiPrio;//
float fHhAlarmValue;//
int nHhPrio;//

//////////////////////////////////////////////////////////////////////////
//添加累积参数
bool bAccumulate;//累积开关
int nTimeCoeff;//时间系数 //根据累积参数将工程单位转化为累积单位
int nUnitCoeff;//单位系数

//////////////////////////////////////////////////////////////////////////


TYPE_DESCRIPTOR(
(
KEY(pszTagName, INDEXED),
FIELD(TagID),
FIELD(TagType),
FIELD(pv),
FIELD(strpv), //ysm091106 add
FIELD(strprepv),//ysm091106 add
FIELD(pvPre),
FIELD(lSampleTime0),
FIELD(lSampleTime),
//////////////////////////////////////////////////////////////////////////
//量程变换用
FIELD(bTransRange),
FIELD(fEuhi),
FIELD(fEulo),
FIELD(fPvRawHi),
FIELD(fPvRawLo),
FIELD(cSignalType),
//////////////////////////////////////////////////////////////////////////
//保存报警配置信息
FIELD(bAlarmEn),
FIELD(fAlarmDB),
FIELD(bHhAlarmEn),
FIELD(bHiAlarmEn),
FIELD(bLlAlarmEn),
FIELD(bLoAlarmEn),
FIELD(fLlAlarmValue),
FIELD(nLlPrio),
FIELD(fLoAlarmValue),
FIELD(nLoPrio),
FIELD(fHhAlarmValue),
FIELD(nHhPrio),
FIELD(fHiAlarmValue),
FIELD(nHiPrio),
//////////////////////////////////////////////////////////////////////////
//累积参数
FIELD(bAccumulate),
FIELD(nTimeCoeff),
FIELD(nUnitCoeff)
)
);
};



[解决办法]
fastdb 以前试用过,是个非常快的数据库,它的插入记录速度太惊人了

insert(RTRecord); 这个函数是fastdb的函数吗?应该跟进去看看哪句出错了,或者GetlastError()试试!


[解决办法]
不要用指针,改成一个字符数组试试

------解决方案--------------------


RTRecord.pszTagName = curAIConf0->pszTagName;
应该用memcpy
[解决办法]
这个好像是内存数据库,如果插入出错的话,那可能是动态分配内存出错了。查查看这个函数体的代码吧
dbfielddescriptor::calculateRecordsize。
楼主有现成的历程吗?我很想要一份呀:)
2002black2002@163.com

读书人网 >VC/MFC

热点推荐