다음을 통해 공유


OLE DB 공급자로 문자열 읽어들이기

함수는 CCustomRowset::Execute 파일을 열고 문자열을 읽습니다. 소비자는 ICommandText::SetCommandText를 호출 하여 파일 이름을 공급자에 전달합니다. 공급자는 파일 이름을 수신하고 멤버 변수 m_strCommandText에 저장합니다. Execute 에서 파일 이름을 읽습니다 m_strCommandText. 파일 이름이 잘못되었거나 파일을 사용할 수 없는 Execute 경우 오류가 반환됩니다. 그렇지 않으면 파일을 열고 문자열을 검색하기 위해 호출 fgets 합니다. 읽 Execute 는 각 문자열 집합에 대해 사용자 레코드의 인스턴스를 만들고(OLE DB 공급자의 문자열 저장에서 수정 CCustomWindowsFile 됨) 배열에 배치합니다.

파일을 열 Execute 수 없는 경우 DB_E_NOTABLE 반환해야 합니다. 대신 E_FAIL 반환하는 경우 공급자는 많은 소비자와 함께 작동하지 않으며 OLE DB 규칙 테스트를 통과하지 않습니다.

예시

/////////////////////////////////////////////////////////////////////////
// CustomRS.h
class CCustomRowset : public CRowsetImpl< CCustomRowset, CCustomWindowsFile, CCustomCommand>
{
public:
    HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
    {
        enum {
            sizeOfBuffer = 256,
            sizeOfFile = MAX_PATH
        };
        USES_CONVERSION;
        FILE* pFile = NULL;
        TCHAR szString[sizeOfBuffer];
        TCHAR szFile[sizeOfFile];
        size_t nLength;

        ObjectLock lock(this);

        // From a filename, passed in as a command text, scan the file
        // placing data in the data array.
        if (!m_strCommandText)
        {
            ATLTRACE("No filename specified");
            return E_FAIL;
        }

        // Open the file
        _tcscpy_s(szFile, sizeOfFile, m_strCommandText);
        if (szFile[0] == _T('\0') ||
            (fopen_s(&pFile, (char*)&szFile[0], "r") == 0))
        {
            ATLTRACE("Could not open file");
            return DB_E_NOTABLE;
        }

        // Scan and parse the file.
        // The file should contain two strings per record
        LONG cFiles = 0;
        while (fgets((char*)szString, sizeOfBuffer, pFile) != NULL)
        {
            nLength = strnlen((char*)szString, sizeOfBuffer);
            szString[nLength-1] = '\0';   // Strip off trailing CR/LF
            CCustomWindowsFile am;
            _tcscpy_s(am.szCommand, am.iSize, szString);
            _tcscpy_s(am.szCommand2, am.iSize, szString);

            if (fgets((char*)szString, sizeOfBuffer, pFile) != NULL)
            {
                nLength = strnlen((char*)szString, sizeOfBuffer);
                szString[nLength-1] = '\0'; // Strip off trailing CR/LF
                _tcscpy_s(am.szText, am.iSize, szString);
                _tcscpy_s(am.szText2, am.iSize, szString);
            }

            am.dwBookmark = ++cFiles;
            if (!m_rgRowData.Add(am))
            {
                ATLTRACE("Couldn't add data to array");
                fclose(pFile);
                return E_FAIL;
            }
        }

        if (pcRowsAffected != NULL)
            *pcRowsAffected = cFiles;
        return S_OK;
    }
};

이 작업이 완료되면 공급자가 컴파일하고 실행할 준비가 되어 있어야 합니다. 공급자를 테스트하려면 일치하는 기능을 가진 소비자가 필요합니다. 단순 소비자 를 구현하면 이러한 테스트 소비자를 만드는 방법이 표시됩니다. 공급자를 사용하여 테스트 소비자를 실행하고 테스트 소비자가 공급자로부터 적절한 문자열을 검색했는지 확인합니다.

공급자를 성공적으로 테스트한 경우 추가 인터페이스를 구현하여 해당 기능을 향상할 수 있습니다. 간단한 읽기 전용 공급자 강화에 예제가 나와 있습니다.

참고 항목

단순한 읽기 전용 공급자 구현