OLE DB 공급자를 읽기 문자열

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;
}

Index