RMyProviderRowset::Execute
Funkcja zostanie otwarty plik i odczytuje ciągi. Konsument przekazuje nazwę pliku do dostawcy przez wywołanie ICommandText::SetCommandText. Dostawca otrzymuje nazwę pliku i zapisuje ją w zmiennej członek m_szCommandText
. Execute
odczytuje nazwa pliku z m_szCommandText
. Jeśli nazwa pliku jest nieprawidłowa lub plik jest niedostępny, Execute
zwraca błąd. W przeciwnym razie otwiera plik i wywołuje fgets do pobierania ciągów. Dla każdego zestawu ciągi on odczyty, Execute
tworzy instancję rekordu użytkownika ( CAgentMan
) i umieszcza go w tablicy.
Jeśli nie można otworzyć pliku, Execute
musi zwracać DB_E_NOTABLE. Jeśli E_FAIL zwraca zamiast, dostawca nie będą działać z wielu konsumentów i nie przejdą testów zgodności OLE DB.
Edytowany Execute
funkcja wygląda to:
/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
Klasa RMyProviderRowset: CRowsetImpllt publicznych; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
publiczne:
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
USES_CONVERSION;
PLIK * pFile;
TCHAR szString [256];
TCHAR szFile [MAX_PATH];
int nLength;
ObjectLock lock(this);
/ / Z nazwą pliku, przekazany jako tekst polecenia, skanowanie pliku
/ / umieszczania danych w tablicy danych.
Jeżeli (! m_szCommandText)
{
ATLTRACE ("nie podano nazwy pliku");
Zwraca E_FAIL;
}
/ / Otwórz plik
_tcscpy (szFile, m_szCommandText);
Jeżeli (szFile [0] == _T('\0') || ((pFile = fopen (& szFile [0], "r")) == NULL))
{
ATLTRACE ("nie można otworzyć pliku");
Zwraca DB_E_NOTABLE;
}
/ / skanowania i analizować pliku. Plik powinien zawierać dwa ciągi jednego rekordu
LONG cFiles = 0;
podczas gdy (fgets (szString, 256 pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = '\0'; / / Strip wyłączyć końcowe CR/LF
Jestem CAgentMan;
_tcscpy (am.szCommand, szString);
_tcscpy (am.szCommand2, szString);
Jeżeli (fgets (szString, 256 pFile)! = NULL)
{
nLength = strlen(szString);
szString [nLength-1] = '\0'; / / Strip wyłączyć końcowe CR/LF
_tcscpy (am.szText, szString);
_tcscpy (am.szText2, szString);
}
am.dwBookmark = ++ cFiles;
Jeżeli (! m_rgRowData.Add(am))
{
ATLTRACE ("nie można dodawać dane do tablicy");
fclose(pFile);
Zwraca E_FAIL;
}
}
Jeżeli (pcRowsAffected! = NULL)
* pcRowsAffected = cFiles;
Zwraca wartość S_OK;
}