OLE DB プロバイダーへの文字列の読み込み

RMyProviderRowset::Execute関数は、ファイルを開き、文字列を読み取ります。呼び出すことによって、消費者、ファイル名、プロバイダーに渡す ICommandText::SetCommandText。プロバイダー名を受け取り、それをメンバー変数に格納 m_szCommandText . Execute からファイル名を読み取ります m_szCommandText 。ファイル名が無効であるか、ファイルがない場合 Execute はエラーを返します。それ以外の場合は、ファイルを開き、文字列を取得するには、 fgetsをを呼び出し。文字列の読み取り、各設定の Execute ユーザー レコードのインスタンスが作成されます ( CAgentMan ) を配列に配置。

ファイル開くことができない場合は、 Execute DB_E_NOTABLEを返す必要があります。それが代わりにE_FAILを返した場合は、プロバイダーは多くの消費者には動作しませんし、OLE DB 準拠合致テストを通過しません。

編集した Execute 関数は次のようになります:

///////////////////////////////////////////////////////////////////////////MyProviderRS.hRMyProviderRowset クラス: 公共の CRowsetImpllt;RMyProviderRowset、CAgentMan、CRMyProviderCommand >{パブリック。HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected){USES_CONVERSION;ファイル ※ pFile;TCHAR szString [256];TCHAR szFile [MAX_PATH];size_t nLength;ObjectLock lock (this);//、コマンド テキストとして渡されたファイル名をから、ファイル スキャン//データ配列にデータを配置します。場合 (! m_szCommandText){ATLTRACE (「指定なし名」);E_FAIL を返す;}//ファイルをオープン_tcscpy (szFile、m_szCommandText);場合 (szFile [0] _T('\0') = = | |((pFile = fopen (& szFile [0]、"r")) = = NULL)){Atltrace を使用 (「ファイルをを開けませんでした」);DB_E_NOTABLE を返す;}・ スキャン ・ ファイルを解析します。ファイル レコードごとの 2 つの文字列が含まれている必要があります。長い cFiles = 0;中 (fgets (szString、256、pFile)! = NULL){nLength = strlen(szString);szString [nLength-1] = '\0';//オフに末尾に CR や LF をストリップCAgentMan 午前;_tcscpy (am.szCommand、szString);_tcscpy (am.szCommand2、szString);場合 (fgets (szString、256、pFile)! = NULL){nLength = strlen(szString);szString [nLength-1] = '\0';//オフに末尾に CR や LF をストリップ_tcscpy (am.szText、szString);_tcscpy (am.szText2、szString);}am.dwBookmark = + + cFiles;場合 (! m_rgRowData.Add(am)){Atltrace を使用 (「データ配列に追加できませんでした");fclose(pFile);E_FAIL を返す;}}場合 (pcRowsAffected! = NULL)※ pcRowsAffected = cFiles;S_OK を返す;}

Index