C++ 我可以从函数返回CRecordset对象吗?

C++ 我可以从函数返回CRecordset对象吗?,c++,mfc,odbc,recordset,C++,Mfc,Odbc,Recordset,我有我的MFC vc++项目。我的UI和业务逻辑层与数据访问层分离。 我有一个函数,可以从数据库中选择一些数据,并将其保存到CRecordset对象中。此select查询在数据访问层中处理。当我试图返回记录集(使用数据在UI中构造表)时,我得到一个错误 我试过这个: CRecordset COrderSearch::ExecuteSqlQuery(CString query) { CString sqlQuery; CRecordset records; CDatabase database;

我有我的MFC vc++项目。我的UI和业务逻辑层与数据访问层分离。 我有一个函数,可以从数据库中选择一些数据,并将其保存到CRecordset对象中。此select查询在数据访问层中处理。当我试图返回记录集(使用数据在UI中构造表)时,我得到一个错误

我试过这个:

CRecordset COrderSearch::ExecuteSqlQuery(CString query)
{
CString sqlQuery;
CRecordset records;
CDatabase database;
sqlQuery = L"SELECT * FROM USers";
SetConnectionStr(connectionString);  //set the connection string
ConnectToDatabase();  //database.open()     
records.m_pDatabase = &database;
records.Open(CRecordset::dynaset, sqlQuery, CRecordset::readOnly);
return records;
}
我得到的错误是:

error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'

CObject
是一个不可复制的类。复制者是私有的,以防止复制

因为
CRecordset
继承自
CObject
,并且不提供自己的复制构造函数。它也不可复制。按值返回需要存在副本(或移动)构造函数

所以你唯一的办法就是要么使用“输出参数”;让调用者传递
CRecordset
,该
ExecuteSqlQuery
应填充:

void COrderSearch::ExecuteSqlQuery(CString query, CRecordset& outRecords) {
  // populate outRecords
}

或者返回一个智能指针指向
CRecordset

编译器为您回答了这个问题,这是一个明确的否定!错误消息不是最大的,但它在谷歌上搜索得非常好。另一方面,
records.m_pDatabase
将是
ExecuteSqlQuery
返回后的一个悬空指针,因为
database
是一个局部变量,返回时会被销毁。