数据库异常,高手救命
我用的是Recordset类连接Access数据库,程序要求我的机位总数可设(每个机位对应数据库中一条记录)。
现在出现这种异常:当我在程序中设定64个机位时,即访问整个表(64条记录),将各条记录值都设定好了;然后有时需要设定较少机位(譬如只用32个,那么只访问前32条记录),也没什么异常。但当我再恢复成64个机位后,发现33—64号机位原来设定好的值全部被清空了,数值项全被清为零,字符串项被清空没有文字。
有时更甚的是,当在程序中设定1—32号记录时,在数据库表中却给记录到了33—64的对应记录上;而33—64却对应着表中的1—32号记录。请问哪位高手遇到过这种情况,该如何解决啊?
我的这个软件马上就要交了,但数据库连接总出问题,请务必帮帮我吧!!!拜谢了先!!!
问题点数:60、回复次数:5Top
1 楼dirdirdir3(风)回复于 2005-08-03 21:15:53 得分 30
每次操作前都要把数据表指针移动到第一个那里去啊Top
2 楼saliors(正在学习中)回复于 2005-08-04 07:55:06 得分 10
把你的程序操作数据库部分程序贴一下看看。Top
3 楼qiuxiangyong(qxy)回复于 2005-08-04 08:59:59 得分 20
你不是把“机位”作关键字吗?每次写入或者读取的时候按照这个key就可以了呀Top
4 楼jimi5013(吉米鱼)回复于 2005-08-04 10:03:24 得分 0
//构造函数
CData::CData()
{
for(int i=0;i<32;i++)
{
m_MachineNumber[i]=i+1;//机位号
}
if(!this->GetData("MachineNumber >0"))
AfxMessageBox("Error when get data from DB!");//MachineNumber是表的主键
//是一个自动增量
}
//从数据库读取数据
BOOL CData::GetData(CString sql)
{
CUserRecordSet rs;
try
{
if(rs.IsOpen())
rs.Close();
rs.m_strFilter=sql;//过滤条件
rs.Open(CRecordset::snapshot,NULL,CRecordset::none);
for(int i=0;i<32;i++)
{
m_MachineNumber[i]=rs.m_MachineNumber;//机位号
m_SensorNumber[i]=rs.m_SensorNumber;//传感器号
m_nUlimit[i]=rs.m_UnitUpperLimit;//单位机上限
m_nLlimit[i]=rs.m_UnitLowerLimit;//单位机下限
m_sState[i]=rs.m_SensorState;
rs.MoveNext();
}
if(rs.IsOpen())
rs.Close();
return true;
}
catch(CDBException *e)
{
AfxMessageBox(e->ReportError());
return false;
}
}
//更新数据库
BOOL CData::UpdateData()
{
CUserRecordSet rs;
try
{
if(rs.IsOpen())
rs.Close();
rs.Open(CRecordset::snapshot,NULL,CRecordset::none);
for(int i=0;i<32;i++)
{
//编辑该条记录内容
rs.Edit();
rs.m_MachineNumber=m_MachineNumber[i];
rs.m_SensorNumber=m_SensorNumber[i];
rs.m_UnitUpperLimit=m_nUlimit[i];
rs.m_UnitLowerLimit=m_nLlimit[i];
rs.m_SensorState=m_sState[i];
//先判断当前是否能够进行更新操作
if(rs.CanUpdate())
rs.Update();
rs.MoveNext();
}
if(rs.IsOpen())
rs.Close();
return true;
}
catch(CDBException *e)
{
AfxMessageBox(e->ReportError());
return false;
}
}
以上是我的源码,还请楼上高手指教Top
5 楼jimi5013(吉米鱼)回复于 2005-08-04 10:07:27 得分 0
//构造函数
CData::CData()
{
for(int i=0;i<32;i++)
{
m_MachineNumber[i]=i+1;//机位号
}
if(!this->GetData("MachineNumber >0"))
AfxMessageBox("Error when get data from DB!");//MachineNumber是表的主键
//是一个自动增量
}
//从数据库读取数据
BOOL CData::GetData(CString sql)
{
CUserRecordSet rs;
try
{
if(rs.IsOpen())
rs.Close();
rs.m_strFilter=sql;//过滤条件
rs.Open(CRecordset::snapshot,NULL,CRecordset::none);
for(int i=0;i<32;i++)
{
m_MachineNumber[i]=rs.m_MachineNumber;//机位号
m_SensorNumber[i]=rs.m_SensorNumber;//传感器号
m_nUlimit[i]=rs.m_UnitUpperLimit;//单位机上限
m_nLlimit[i]=rs.m_UnitLowerLimit;//单位机下限
m_sState[i]=rs.m_SensorState;
rs.MoveNext();
}
if(rs.IsOpen())
rs.Close();
return true;
}
catch(CDBException *e)
{
AfxMessageBox(e->ReportError());
return false;
}
}
//更新数据库
BOOL CData::UpdateData()
{
CUserRecordSet rs;
try
{
if(rs.IsOpen())
rs.Close();
rs.Open(CRecordset::snapshot,NULL,CRecordset::none);
for(int i=0;i<32;i++)
{
//编辑该条记录内容
rs.Edit();
rs.m_MachineNumber=m_MachineNumber[i];
rs.m_SensorNumber=m_SensorNumber[i];
rs.m_UnitUpperLimit=m_nUlimit[i];
rs.m_UnitLowerLimit=m_nLlimit[i];
rs.m_SensorState=m_sState[i];
//先判断当前是否能够进行更新操作
if(rs.CanUpdate())
rs.Update();
rs.MoveNext();
}
if(rs.IsOpen())
rs.Close();
return true;
}
catch(CDBException *e)
{
AfxMessageBox(e->ReportError());
return false;
}
}
不好意思,上面的格式太乱,我重发Top




