2017-09-20 1 views
2

나는 내 프로젝트를 MFC vC++에서 가지고있다. 데이터 액세스 레이어와 분리 된 UI 및 비즈니스 로직 레이어가 있습니다. 데이터베이스에서 CRecordset 개체로 일부 데이터를 선택하는 함수가 있습니다. 이 선택 쿼리는 데이터 액세스 계층에서 처리됩니다. UI에서 테이블을 생성하기 위해 데이터를 사용하기 위해 레코드 세트를 반환하려고하면 오류가 발생합니다. 함수에서 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' 
+1

컴파일러가이 질문에 대답했습니다.이 질문은 명확한 아니오입니다! 오류 메시지가 가장 큰 것은 아니지만 실제로는 잘 봤습니다. –

+0

'database'는 반환 할 때 파괴되는 로컬 변수이므로'records.m_pDatabase'는'ExecuteSqlQuery'가 리턴 한 후에 매달려있는 포인터가됩니다. – zett42

답변

3

CObject가 아닌 복사 가능한 클래스입니다. 카피는 비공개로되어있어 카피를 방지합니다.

CRecordsetCObject에서 상속되며 자체 복제 생성자를 제공하지 않으므로 사본도 없습니다. 값으로 반환하려면 복사 (또는 이동) 생성자가 있어야합니다.

그래서 유일한 방법은 "출력 매개 변수"를 사용하는 것입니다.

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

을 아니면 CRecordset에 스마트 포인터를 반환 : 발신자가 ExecuteSqlQuery이 채워해야 CRecordset 되었 있습니다.

관련 문제