Einlesen von Zeichenfolgen in den OLE DB-Anbieter

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

Index