Ole db sağlayıcısını okuma dizeleri

RMyProviderRowset::Executeİşlevi bir dosyayı açar ve dizeler okur. Tüketici dosya sağlayıcıya arayarak geçirir ICommandText::setCommandText. Sağlayıcı dosya adını alır ve üye değişkeninde saklar m_szCommandText . Execute gelen dosya adını okur m_szCommandText . Dosya adı geçersiz veya dosya kullanılamaz duruma Execute bir hata döndürür. Aksi takdirde, dosya açılır ve dizeleri almak için fgets çağırır. Dizeleri okur, o her kümesi için Execute kullanıcı kaydı örneğini oluşturur ( CAgentMan ) ve bir diziye yerleştirir.

Dosya açılamıyor, Execute db_e_notabledöndürmelidir. Bunun yerine E_FAIL döndürür, sağlayıcı birçok tüketici ile çalışmaz ve ole db uygunluk testleri geçmek olmaz.

Düzenlenmiş Execute işlevi gibi görünüyor:

/////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
RMyProviderRowset sınıfı: Genel CRowsetImpllt; RMyProviderRowset, CAgentMan, CRMyProviderCommand >
{
public:
   
hresult Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
 USES_CONVERSION;
 Dosya * pFile;
 tchar szString [256];
 tchar szFile [max_path];
 size_t nLength;
 ObjectLock lock(this);

/ / Gelen bir komut metni geçirilen dosya adı, dosya tarama
 / / veri dizisi veri yerleştirme.
 Eğer (! m_szCommandText)
 {
    atltrace ("hiçbir dosya belirtilen");
    e_faıl döndürür;
 }

/ / Dosya açma
 _tcscpy (szFile, m_szCommandText);
 Eğer (szFile [0] = _t('\0') || ((pFile = fopen (& szFile [0], "r")) == null))
 {
    atltrace ("Dosya açılamıyor");
    return db_e_notable;
 }

/ / tarama ve dosya ayrıştırma.  Dosya kayıt başına iki dizeleri içermelidir
 UZUN cFiles = 0;
 süre (fgets (szString, 256, pFile)! = null)
 {
    nLength = strlen(szString);
    szString [nLength-1] = '\0';   / / cr ve lf sondaki şerit
    CAgentMan 'm;
    _tcscpy (am.szCommand, szString);
    _tcscpy (am.szCommand2, szString);

Eğer (fgets (szString, 256, pFile)! = null)
    {
       nLength = strlen(szString);
       szString [nLength-1] = '\0';   / / cr ve lf sondaki şerit
       _tcscpy (am.szText, szString);
       _tcscpy (am.szText2, szString);
    }

AM.dwBookmark = ++ cFiles;
    Eğer (! m_rgRowData.Add(am))
    {
       atltrace ("veri dizisine eklenemedi");
       fclose(pFile);
       e_faıl döndürür;
    }
 }

Eğer (pcRowsAffected! = null)
    * pcRowsAffected = cFiles;
 s_ok döndürür;
}

Index