You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CRecordset::Open判断是否未返回任何记录?

正确判断CRecordset是否存在记录的方法

首先明确:CRecordset::Open返回true仅表示成功打开记录集,哪怕查询结果为空也会返回true——这就是你触发"Invalid cursor state"异常的核心原因:空记录集的游标没有指向任何有效记录,直接调用GetFieldValue必然报错。

正确的判断方式

使用CRecordset::IsEOF()方法检查:

  • 若记录集为空,IsEOF()会返回true(打开空记录集后,游标直接位于所有记录的末尾之后)
  • 若存在至少一条记录,IsEOF()返回false,此时游标指向第一条记录,可安全读取字段值。

修改后的代码示例

CString strSQL = _T("");

rAryStrMemo.RemoveAll(); // Type CStringArray

strSQL.Format(_T("SELECT memo1, memo2, memo3, memo4, memo5 FROM [Congregation Speakers] WHERE Congregation='%s' AND Speaker='%s'"),
    theApp.FormatDBText(strCongregation),
    theApp.FormatDBText(strSpeaker));

CRecordset *pRecords = new CRecordset(theApp.GetDatabase());
if (pRecords->Open(CRecordset::snapshot, (LPCTSTR)strSQL, CRecordset::readOnly))
{
    // 先检查是否有有效记录
    if (!pRecords->IsEOF())
    {
        CString strMemo = _T("");
        GetFieldValue(pRecords, _T("memo1"), strMemo); rAryStrMemo.Add(strMemo);
        GetFieldValue(pRecords, _T("memo2"), strMemo); rAryStrMemo.Add(strMemo);
        GetFieldValue(pRecords, _T("memo3"), strMemo); rAryStrMemo.Add(strMemo);
        GetFieldValue(pRecords, _T("memo4"), strMemo); rAryStrMemo.Add(strMemo);
        GetFieldValue(pRecords, _T("memo5"), strMemo); rAryStrMemo.Add(strMemo);
    }
    // 必须关闭记录集,避免资源泄漏
    pRecords->Close();
}
// 释放动态分配的内存
delete pRecords;

额外优化提示

  1. 你的GetFieldValue函数里的强制转换rstrValue = (LPCTSTR)strTemp完全多余,CString可直接赋值给CString&,改成rstrValue = strTemp即可。
  2. 务必在操作结束后关闭记录集并释放指针内存,否则会造成数据库连接资源泄漏。

内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:30:22