У меня есть проект в MFC vc ++. Мой уровень пользовательского интерфейса и бизнес-логики отделен от уровня доступа к данным.
У меня есть функция, которая выбирает некоторые данные из базы данных в объект CRecordset. этот запрос на выборку обрабатывается на уровне доступа к данным. Когда я пытаюсь вернуть набор записей (чтобы использовать данные для построения таблицы в пользовательском интерфейсе), я получаю сообщение об ошибке.
Я попробовал это:
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
это не копируемый класс. Копия c’tor делается частной, чтобы предотвратить копирование.
поскольку CRecordset
наследуется от CObject
и не предоставляет свой собственный конструктор копирования. Это также не копируется. Возврат по значению требует наличия конструктора копирования (или перемещения).
Таким образом, вы можете использовать «выходной параметр»; попросить звонящего передать CRecordset
тот ExecuteSqlQuery
следует заселить:
void COrderSearch::ExecuteSqlQuery(CString query, CRecordset& outRecords) {
// populate outRecords
}
Или верните умный указатель на CRecordset
,
Других решений пока нет …