如何通过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;
额外优化提示
- 你的
GetFieldValue函数里的强制转换rstrValue = (LPCTSTR)strTemp完全多余,CString可直接赋值给CString&,改成rstrValue = strTemp即可。 - 务必在操作结束后关闭记录集并释放指针内存,否则会造成数据库连接资源泄漏。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

