การ 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
}