將字串讀入 OLE DB 提供者內
函 CCustomRowset::Execute
式會開啟檔案並讀取字串。 取用者會呼叫 ICommandText::SetCommandText,將檔名傳遞至提供者。 提供者會接收檔名,並將它儲存在成員變數 m_strCommandText
中。 Execute
從 m_strCommandText
讀取檔名。 如果檔名無效或檔案無法使用, Execute
則傳回錯誤。 否則,它會開啟 檔案並呼叫 fgets
以擷取字串。 針對它讀取的每個字串集, Execute
建立用戶記錄的實例( CCustomWindowsFile
從 OLE DB 提供者中儲存 Strings 修改),並將它放入數位中。
如果無法開啟檔案, Execute
則必須傳回DB_E_NOTABLE。 如果它改為傳回E_FAIL,提供者將無法與許多取用者搭配使用,也不會通過 OLE DB 一致性測試。
範例
/////////////////////////////////////////////////////////////////////////
// CustomRS.h
class CCustomRowset : public CRowsetImpl< CCustomRowset, CCustomWindowsFile, CCustomCommand>
{
public:
HRESULT Execute(DBPARAMS * pParams, LONG* pcRowsAffected)
{
enum {
sizeOfBuffer = 256,
sizeOfFile = MAX_PATH
};
USES_CONVERSION;
FILE* pFile = NULL;
TCHAR szString[sizeOfBuffer];
TCHAR szFile[sizeOfFile];
size_t nLength;
ObjectLock lock(this);
// From a filename, passed in as a command text, scan the file
// placing data in the data array.
if (!m_strCommandText)
{
ATLTRACE("No filename specified");
return E_FAIL;
}
// Open the file
_tcscpy_s(szFile, sizeOfFile, m_strCommandText);
if (szFile[0] == _T('\0') ||
(fopen_s(&pFile, (char*)&szFile[0], "r") == 0))
{
ATLTRACE("Could not open file");
return DB_E_NOTABLE;
}
// Scan and parse the file.
// The file should contain two strings per record
LONG cFiles = 0;
while (fgets((char*)szString, sizeOfBuffer, pFile) != NULL)
{
nLength = strnlen((char*)szString, sizeOfBuffer);
szString[nLength-1] = '\0'; // Strip off trailing CR/LF
CCustomWindowsFile am;
_tcscpy_s(am.szCommand, am.iSize, szString);
_tcscpy_s(am.szCommand2, am.iSize, szString);
if (fgets((char*)szString, sizeOfBuffer, pFile) != NULL)
{
nLength = strnlen((char*)szString, sizeOfBuffer);
szString[nLength-1] = '\0'; // Strip off trailing CR/LF
_tcscpy_s(am.szText, am.iSize, szString);
_tcscpy_s(am.szText2, am.iSize, szString);
}
am.dwBookmark = ++cFiles;
if (!m_rgRowData.Add(am))
{
ATLTRACE("Couldn't add data to array");
fclose(pFile);
return E_FAIL;
}
}
if (pcRowsAffected != NULL)
*pcRowsAffected = cFiles;
return S_OK;
}
};
完成此作業後,您的提供者應該已準備好進行編譯和執行。 若要測試提供者,您需要具有相符功能的取用者。 實作簡單取用者 會示範如何建立這類測試取用者。 使用提供者執行測試取用者,並確認測試取用者從提供者擷取適當的字串。
當您成功測試提供者時,可能會想要藉由實作其他介面來增強其功能。 增強簡單唯讀提供者中會顯示一個範例。