定时器 OnTimer 中使用ADO 查询数据库视图结果,并返回结果集到程序中报错

时间:2022-12-14 00:51:12
在MFC中定时器 OnTimer 中使用ADO 查询数据库视图结果,并返回结果集到程序中报错
用errormessage.Format(e.Description()) 显示错误:row handle referred to a deleted row marked for deletion.

代码如下:
try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
CString cs_sql,cs_subject,cs_body;


cs_sql.Format(_T("select convert(char(19),testtime,120) testtime,jobno,deviceid ,station,description,inputqty,outputqty,yield*100 yield,yieldredline*100 yieldredline,sendto from MSGJobStationAlarm(nolock)"));
//AfxMessageBox(cs_sql);
m_pRecordset->Open(_bstr_t(cs_sql.AllocSysString()),_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

while(!(m_pRecordset->adoEOF))
{
vTesttime = m_pRecordset->GetCollect("testtime");
。。。
m_pRecordset->MoveNext();

}

}

catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format(e.Description());
AfxMessageBox(errormessage);///显示错误信息
}

}

如果我的sql 使用的是 select count(*) from ..... 能得到正确的结果,这是为什么啊? 望高手解惑,万分感谢

24 个解决方案

#1


m_pRecordset->Open(_bstr_t(cs_sql.AllocSysString()),_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

if (!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox(_T("查询到的数据为空"));
return;
}


while(!(m_pRecordset->adoEOF))

#2


fandh : 你说的啥? 我不明白啊? 好像和我的问题无关吧,我的是根本就查询不到数据集,但换个SQL 就能得到数据,而且我的这个sql 在数据库中是能查询出数据的

#3


if(!(m_pRecordset->adoEOF) && !(m_pRecordset->BOF))  // 结果集非空
{
  m_pRecordset->MoveFirst();  // 移动到第一条记录处
  while(!(m_pRecordset->adoEOF))
  {
    vTesttime = m_pRecordset->GetCollect("testtime");
    //。。。
    m_pRecordset->MoveNext();
}

#4


那说明你的SQL出错了!检查你的SQL语句,不行的话,打印出来,然后直接到数据库中执行,看看是否有结果

看样子不是我理解问题,是你没有说清楚,你看楼上的,与我开始理解的一样!

#5


lfchen 谢谢 
不过问题依旧

#6


fandh 谢谢

sql 语句检查过了,在SQL SERVER 里能得到结果集的

#7


这个好像不是SQL 语句的问题, 这个语句我在sql server 中运行能得到数据集,且是不为空的,但如果我用另外的sql : 查询这个表的总的数据记录条数能得到17 这个正确的结果

#8


呀,那你在while 循环内设置断点,可以跟踪到么?

#9


MoveFirst();还是要的!

#10


// 是catch到错误了吗?catch到的错误信息是什么?

#11


// 挂个断点,看看具体是哪一句出错的。

#12


根本就没有结果集,直接就CATCH 错误了啊,错误: row handle referred to a deleted row or a row marked for deletion 

#13


m_pRecordset->MoveFirst();  加上了?

#14


加上了

#15


我还是怀疑cs_sql里面的不对!
你确定在数据库里面执行的,就是这里面的值?你要不直接用字符串试试?

#16


直接从代码里拷贝的字符串到SQL SERVER 中执行的,没有问题

#17


会不会是因为在定时器里,ADO 会有什么问题吗? 我是用再定时器里的

#18


你多长时间执行一次?

#19


10秒

#20


数据多么?要不,时间再长一点,10秒应该挺长的了!

#21


本帖最后由 zyq5945 于 2011-10-20 16:43:10 编辑
在定时器中是没有问题的,做过测试,死循环查询数据库都没事,就是CPU占用高一些。
打开记录集的CursorTypeEnum的adOpenStatic换成adOpenDynamic。

#22


zyq5945 谢谢

问题解决,但为什么静态就不行啊? 难道是因为我查询的是数据视图的原因?

#23


不知道啊,反正我记得有次我也是修改ACCESS的记录,换了游标才可以。
估计是ADO的bug吧。

#24


恩,谢谢大家,结帖

#1


m_pRecordset->Open(_bstr_t(cs_sql.AllocSysString()),_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

if (!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox(_T("查询到的数据为空"));
return;
}


while(!(m_pRecordset->adoEOF))

#2


fandh : 你说的啥? 我不明白啊? 好像和我的问题无关吧,我的是根本就查询不到数据集,但换个SQL 就能得到数据,而且我的这个sql 在数据库中是能查询出数据的

#3


if(!(m_pRecordset->adoEOF) && !(m_pRecordset->BOF))  // 结果集非空
{
  m_pRecordset->MoveFirst();  // 移动到第一条记录处
  while(!(m_pRecordset->adoEOF))
  {
    vTesttime = m_pRecordset->GetCollect("testtime");
    //。。。
    m_pRecordset->MoveNext();
}

#4


那说明你的SQL出错了!检查你的SQL语句,不行的话,打印出来,然后直接到数据库中执行,看看是否有结果

看样子不是我理解问题,是你没有说清楚,你看楼上的,与我开始理解的一样!

#5


lfchen 谢谢 
不过问题依旧

#6


fandh 谢谢

sql 语句检查过了,在SQL SERVER 里能得到结果集的

#7


这个好像不是SQL 语句的问题, 这个语句我在sql server 中运行能得到数据集,且是不为空的,但如果我用另外的sql : 查询这个表的总的数据记录条数能得到17 这个正确的结果

#8


呀,那你在while 循环内设置断点,可以跟踪到么?

#9


MoveFirst();还是要的!

#10


// 是catch到错误了吗?catch到的错误信息是什么?

#11


// 挂个断点,看看具体是哪一句出错的。

#12


根本就没有结果集,直接就CATCH 错误了啊,错误: row handle referred to a deleted row or a row marked for deletion 

#13


m_pRecordset->MoveFirst();  加上了?

#14


加上了

#15


我还是怀疑cs_sql里面的不对!
你确定在数据库里面执行的,就是这里面的值?你要不直接用字符串试试?

#16


直接从代码里拷贝的字符串到SQL SERVER 中执行的,没有问题

#17


会不会是因为在定时器里,ADO 会有什么问题吗? 我是用再定时器里的

#18


你多长时间执行一次?

#19


10秒

#20


数据多么?要不,时间再长一点,10秒应该挺长的了!

#21


本帖最后由 zyq5945 于 2011-10-20 16:43:10 编辑
在定时器中是没有问题的,做过测试,死循环查询数据库都没事,就是CPU占用高一些。
打开记录集的CursorTypeEnum的adOpenStatic换成adOpenDynamic。

#22


zyq5945 谢谢

问题解决,但为什么静态就不行啊? 难道是因为我查询的是数据视图的原因?

#23


不知道啊,反正我记得有次我也是修改ACCESS的记录,换了游标才可以。
估计是ADO的bug吧。

#24


恩,谢谢大家,结帖