Die RMyProviderRowset::Execute -Funktion öffnet eine Datei und liest Zeichenfolgen. Der Consumer übergibt den Dateinamen an dem Anbieter durch Aufrufen von von ICommandText:: SetCommandText. Der Anbieter empfängt den Dateinamen und speichert ihn in der Membervariable m_szCommandText . Execute liest den Dateinamen aus m_szCommandText . Wenn der Dateiname ungültig ist oder die Datei nicht verfügbar ist, Execute gibt einen Fehler zurück. Andernfalls wird die Datei geöffnet und ruft Fgets , um die Zeichenfolgen abzurufen. Für jede der Zeichenfolgen es liest, Execute erstellt eine Instanz des Benutzerdatensatzes ( CAgentMan ) und platziert es in ein Array.
Wenn die Datei nicht geöffnet werden kann, Execute muss ExecuteDB_E_NOTABLEzurückgeben. Wenn stattdessen E_FAIL zurückgegeben, der Anbieter funktionieren nicht mit zahlreichen Consumern und besteht die OLE DB-Konformitätstests nicht.
Die bearbeiteten Execute Funktion sieht wie folgt aus:
/////////////////////////////////////////////////////////////////////////
/ / Datei MyProviderRS.h
Klasse RMyProviderRowset: öffentliche CRowsetImpllt; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
Öffentliche:
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
DAS USES_CONVERSION;
Datei * pFile;
TCHAR SzString [256];
TCHAR SzFile [MAX_PATH];
Size_t nLength;
ObjectLock lock(this);
/ / Aus einem Dateinamen, als einem Befehlstext übergeben scan die Datei
/ / Ablegen von Daten in das Datenarray.
Wenn (! M_szCommandText)
{
ATLTRACE ("kein Dateiname angegeben");
E_FAIL zurück;
}
/ / Öffnen Sie die Datei
_tcscpy (SzFile, M_szCommandText);
Wenn (SzFile [0] == _T('\0') || ((pFile = Fopen (& SzFile [0], "R")) == NULL))
{
ATLTRACE konnte ("nicht Datei öffnen");
DB_E_NOTABLE zurückgeben;
}
/ / Scannen und Analysieren der Datei. Die Datei sollte zwei Saiten pro Datensatz enthalten.
LANGE cFiles = 0;
während (Fgets (SzString, 256, pFile)! = NULL)
{
nLength = strlen(szString);
SzString [nLength-1] = '\0'; / / Entfernt nachgestellte CR/LF
CAgentMan bin;
_tcscpy (am.szCommand, SzString);
_tcscpy (am.szCommand2, SzString);
Wenn (Fgets (SzString, 256, pFile)! = NULL)
{
nLength = strlen(szString);
SzString [nLength-1] = '\0'; / / Entfernt nachgestellte CR/LF
_tcscpy (am.szText, SzString);
_tcscpy (am.szText2, SzString);
}
am.dwBookmark = ++ cFiles;
Wenn (! m_rgRowData.Add(am))
{
ATLTRACE konnte nicht ("Daten in Array hinzufügen");
fclose(Pfile);
E_FAIL zurück;
}
}
Wenn (PcRowsAffected! = NULL)
* PcRowsAffected = cFiles;
Gibt S_OK zurück.
}