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