Microsoft KB Archive/242249: Difference between revisions
m (Text replacement - "<" to "<") |
m (Text replacement - """ to """) |
||
(2 intermediate revisions by the same user not shown) | |||
Line 88: | Line 88: | ||
// Create a recordset for testing | // Create a recordset for testing | ||
//---------------------------------------- | //---------------------------------------- | ||
if (FAILED(CreateTestRS(& | if (FAILED(CreateTestRS(&rs))) | ||
{ | { | ||
printf( | printf("Couldn't create the first recordset\n"); | ||
goto exit; | goto exit; | ||
} | } | ||
Line 97: | Line 97: | ||
// Create IStream | // Create IStream | ||
//---------------------------------------- | //---------------------------------------- | ||
if (FAILED(SaveRS(rs, (IStream**)& | if (FAILED(SaveRS(rs, (IStream**)&pStream))) | ||
{ | { | ||
printf( | printf("Couldn't save the recordset\n"); | ||
goto exit; | goto exit; | ||
} | } | ||
Line 106: | Line 106: | ||
// Load another recordset from IStream | // Load another recordset from IStream | ||
//---------------------------------------- | //---------------------------------------- | ||
if (FAILED(LoadRS(& | if (FAILED(LoadRS(&rs2, pStream))) | ||
{ | { | ||
printf( | printf("Couldn't save the recordset\n"); | ||
goto exit; | goto exit; | ||
} | } | ||
//Now display the names of the fields of the rs that we just recreated | //Now display the names of the fields of the rs that we just recreated | ||
{ | { | ||
for (short i =0;i<rs2- | for (short i =0;i<rs2->Fields->Count;i++) | ||
printf( | printf("Name of field %d is %s\n", i, (LPCTSTR) rs2->Fields->GetItem(i)->Name); | ||
} | } | ||
Line 125: | Line 125: | ||
exit: | exit: | ||
printf( | printf("Press any key to end program\n"); | ||
_getch(); | _getch(); | ||
return 0; | return 0; | ||
Line 142: | Line 142: | ||
_RecordsetPtr pRS; | _RecordsetPtr pRS; | ||
pRS.CreateInstance( __uuidof(Recordset)); | pRS.CreateInstance( __uuidof(Recordset)); | ||
pRS- | pRS->CursorLocation = adUseClient; | ||
pRS- | pRS->CursorType = adOpenStatic; | ||
pRS- | pRS->LockType = adLockBatchOptimistic; | ||
// append fields | // append fields | ||
pRS- | pRS->Fields->Append(_bstr_t("ADOField1"), adVarChar, 45,adFldFixed); | ||
pRS- | pRS->Fields->Append(_bstr_t("ADOField2"), adBoolean, 0,adFldFixed); | ||
pRS- | pRS->Fields->Append(_bstr_t("ADOField3"), adCurrency, 0,adFldFixed); | ||
pRS- | pRS->Fields->Append(_bstr_t("ADOField4"), adDate, 0,adFldFixed); | ||
pRS- | pRS->Open(vtMissing, vtMissing, adOpenStatic,adLockBatchOptimistic,-1); | ||
*prs= pRS.Detach(); | *prs= pRS.Detach(); | ||
} | } | ||
catch (_com_error & | catch (_com_error & e) | ||
{ | { | ||
return e.Error(); | return e.Error(); | ||
Line 183: | Line 183: | ||
return E_NOINTERFACE; | return E_NOINTERFACE; | ||
} | } | ||
catch (_com_error & | catch (_com_error & e) | ||
{ | { | ||
return e.Error(); | return e.Error(); | ||
Line 204: | Line 204: | ||
//Set the pointer to the beginning of the stream | //Set the pointer to the beginning of the stream | ||
if (FAILED(hr=pStream- | if (FAILED(hr=pStream->Seek(li, STREAM_SEEK_SET, 0))) | ||
return hr; | return hr; | ||
if (FAILED(hr=OleLoadFromStream(pStream, | if (FAILED(hr=OleLoadFromStream(pStream, | ||
__uuidof(_Recordset), | __uuidof(_Recordset), | ||
reinterpret_cast<LPVOID * | reinterpret_cast<LPVOID *>(ppRS))) | ||
) | ) | ||
return hr; | return hr; | ||
} | } | ||
catch (_com_error & | catch (_com_error & e) | ||
{ | { | ||
return e.Error(); | return e.Error(); |
Latest revision as of 13:48, 21 July 2020
Article ID: 242249
Article Last Modified on 8/5/2004
APPLIES TO
- Microsoft ActiveX Data Objects 1.5
- Microsoft ActiveX Data Objects 2.0
- Microsoft ActiveX Data Objects 2.1
- Microsoft ActiveX Data Objects 2.5
- Microsoft ActiveX Data Objects 2.6
- Microsoft ActiveX Data Objects 2.7
This article was previously published under Q242249
SUMMARY
ADOPERSIST.exe is a Visual C++ sample that shows you how to save an ADO recordset to an IStream object and then reload another ADO recordset from it.
ADO 1.5x and 2.x Recordset implementation offers two functions for data persistance to a disk file:
- ADORecordset.Save() to save the recordset object to a file.
- ADORecordset.Open() to reload a recordset from a file.
For performance or other reasons it may sometimes be desired to save an ADO recordset to the memory only as a stream of data. To accomplish that you can use the ADO recordset's IPersistStream interface implementation.
MORE INFORMATION
Saving an ADO Recordset Object
This sample uses the following steps to save an ADO recordset:
- Calls QueryInterface() on the given ADO recordset to get a pointer to the IPersistStream object.
- Uses CreateStreamOnHGlobal() to create a standard, COM, IStream object.
- Calls the COM function OleSaveToStream() to save the IPersistStream object into the IStream object.
Recreating the ADO Recordset
Given the IStream object, the sample then recreates another ADO recordset from it. It does this using the IStream pointer that holds the data stream and calls OleLoadFromStream().
Below is the key code from the sample:
int main(int argc, char* argv[]) { InitOle oleinit; HRESULT hr=S_OK; _RecordsetPtr rs; //Recordset for Saving Data _RecordsetPtr rs2; //Recordset for Loading Data IStreamPtr pStream; //---------------------------------------- // Create a recordset for testing //---------------------------------------- if (FAILED(CreateTestRS(&rs))) { printf("Couldn't create the first recordset\n"); goto exit; } //---------------------------------------- // Create IStream //---------------------------------------- if (FAILED(SaveRS(rs, (IStream**)&pStream))) { printf("Couldn't save the recordset\n"); goto exit; } //---------------------------------------- // Load another recordset from IStream //---------------------------------------- if (FAILED(LoadRS(&rs2, pStream))) { printf("Couldn't save the recordset\n"); goto exit; } //Now display the names of the fields of the rs that we just recreated { for (short i =0;i<rs2->Fields->Count;i++) printf("Name of field %d is %s\n", i, (LPCTSTR) rs2->Fields->GetItem(i)->Name); } //---------------------------------------- // Pause and then exit so that the user // Can //---------------------------------------- exit: printf("Press any key to end program\n"); _getch(); return 0; } //---------------------------------------- // Create a recordset from scratch //---------------------------------------- HRESULT CreateTestRS(_Recordset** prs/*OUT*/) { try { * prs=NULL; _RecordsetPtr pRS; pRS.CreateInstance( __uuidof(Recordset)); pRS->CursorLocation = adUseClient; pRS->CursorType = adOpenStatic; pRS->LockType = adLockBatchOptimistic; // append fields pRS->Fields->Append(_bstr_t("ADOField1"), adVarChar, 45,adFldFixed); pRS->Fields->Append(_bstr_t("ADOField2"), adBoolean, 0,adFldFixed); pRS->Fields->Append(_bstr_t("ADOField3"), adCurrency, 0,adFldFixed); pRS->Fields->Append(_bstr_t("ADOField4"), adDate, 0,adFldFixed); pRS->Open(vtMissing, vtMissing, adOpenStatic,adLockBatchOptimistic,-1); *prs= pRS.Detach(); } catch (_com_error & e) { return e.Error(); } return S_OK; } HRESULT SaveRS(_RecordsetPtr pRS/*IN*/, IStream* * ppStream/*OUT*/) { HRESULT hr=S_OK; try { *ppStream=NULL; // QI and return IPersistStream IPersistStreamPtr pIPersist(pRS); if (pIPersist ) { //Create a standard stream in memory if (FAILED(hr=CreateStreamOnHGlobal(0, TRUE, (IStream **)ppStream))) return hr; // Persist the pRS if (FAILED(hr=OleSaveToStream(pIPersist, *ppStream))) return hr; } else return E_NOINTERFACE; } catch (_com_error & e) { return e.Error(); } return S_OK; } HRESULT LoadRS(_Recordset* *ppRS/*OUT*/, IStreamPtr pStream/*IN*/) { HRESULT hr=S_OK; try { *ppRS=NULL; if (NULL==pStream) return E_NOINTERFACE; // Load the pRS. LARGE_INTEGER li; li.QuadPart = 0; //Set the pointer to the beginning of the stream if (FAILED(hr=pStream->Seek(li, STREAM_SEEK_SET, 0))) return hr; if (FAILED(hr=OleLoadFromStream(pStream, __uuidof(_Recordset), reinterpret_cast<LPVOID *>(ppRS))) ) return hr; } catch (_com_error & e) { return e.Error(); } return S_OK; }
The following files are available for download from the Microsoft Download Center:
For additional information about how to download Microsoft Support files, click the following article number to view the article in the Microsoft Knowledge Base:
119591 How to Obtain Microsoft Support Files from Online Services
Microsoft scanned this file for viruses. Microsoft used the most current virus-detection software that was available on the date that the file was posted. The file is stored on security-enhanced servers that help to prevent any unauthorized changes to the file.
ADOPersist.cpp | 4.1KB |
---|---|
ADOPersist.dsp | 4.0KB |
Keywords: kbhowto kbdownload kbdatabase kbfile KB242249