สตริอ่านเป็นผู้ให้บริการ 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.h
คลา RMyProviderRowset: สาธารณะ 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
 }

/ / สแกน และแยกวิเคราะห์แฟ้ม  แฟ้มควรประกอบด้วยสายอักขระที่สองต่อหนึ่งระเบียนข้อมูล
 ยาว 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