RMyProviderRowset::Execute함수는 파일을 열고 문자열을 읽습니다. 소비자를 호출 하 여 공급자에 파일 이름 전달 ICommandText::SetCommandText. 공급자 파일을 수신 하 고 멤버 변수에 저장 m_szCommandText . Execute 에서 파일을 읽고 m_szCommandText . 경우에 파일 이름이 유효 하지 않거나 파일을 사용할 수 없으면 Execute 오류를 반환 합니다. 그렇지 않으면, 그것은 파일을 열고 문자열을 검색 하려면 fgets 를 호출. 각 집합에 대해 문자열의 그것 읽기, Execute 사용자 레코드의 인스턴스를 만듭니다 ( CAgentMan ) 및 배열에 넣습니다。
파일을 열 수 없는 경우 Execute DB_E_NOTABLE을 반환 해야 합니다. 공급자가 많은 소비자와 함께 작동 하지 않습니다 하 고이 OLE DB 규칙 테스트를 통과 하지 않습니다 그것 대신 E_FAIL 을 반환 하는 경우。
편집한 Execute 함수를 다음과 같이:
/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
RMyProviderRowset 클래스: 공용 CRowsetImpllt; RMyProviderRowset CAgentMan, CRMyProviderCommand >
{
공개:
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
USES_CONVERSION;
파일 * pFile;
TCHAR szString [256];
TCHAR szFile [MAX_PATH];
size_t nLength;
ObjectLock lock(this);
/ / 명령 텍스트로 전달 된 파일에서 파일을 스캔
/ / 데이터 배열에 데이터를 배치 합니다.
경우 (! m_szCommandText)
{
ATLTRACE 파일 ("없음 이름 지정");
E_FAIL; 반환
}
/ / 파일을 엽니다
_tcscpy (szFile, m_szCommandText);
경우 (szFile [0] _T('\0') = = | | ((pFile = fopen (& szFile [0], "r")) = = NULL))
{
ATLTRACE ("열 수 없습니다 파일");
DB_E_NOTABLE; 반환
}
/ / 스캔 하 고 파일을 구문 분석 합니다.? 파일 레코드 당 두 문자열이 있어야 합니다.
긴 cFiles = 0;
동안 (fgets (szString, 256, pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = '\ 0'; / / CR/LF 후행 스트립
CAgentMan 오전;
_tcscpy (am.szCommand, szString);
_tcscpy (am.szCommand2, szString);
경우 (fgets (szString, 256, pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = '\ 0'; / / CR/LF 후행 스트립
_tcscpy (am.szText, szString);
_tcscpy (am.szText2, szString);
}
am.dwBookmark = + + cFiles;
경우 (! m_rgRowData.Add(am))
{
ATLTRACE ("수 없습니다 추가 데이터 배열");
fclose(pFile);
E_FAIL; 반환
}
}
경우 (pcRowsAffected! = NULL)
* pcRowsAffected = cFiles;
return S_OK;
}