【VC开源代码栏目提醒】:网学会员在VC开源代码频道为大家收集整理了ADOWin32ConsoleMemoryPersist.cpp提供大家参考,希望对大家有所帮助!
// ADOWin32ConsoleMemoryPersist.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
//初始化COM环境
struct InitOle
{
InitOle() { CoInitialize(NULL); }
~InitOle() { CoUninitialize(); }
};
//函数向前定义
HRESULT SaveRS(_RecordsetPtr pRS/*IN*/, IStream* * ppStream/*OUT*/);
HRESULT LoadRS(_Recordset**ppRS/*OUT*/, IStreamPtr pStream/*IN*/);
HRESULT CreateTestRS(_Recordset **pRS/*OUT*/);
//主程序
int _tmain(int argc, _TCHAR* argv[])
{
InitOle oleinit;
HRESULT hr=S_OK;
_RecordsetPtr rs1; //将数据保存到IStream对象中的ADO记录集
_RecordsetPtr rs2; //从IStream对象中的读取数据的ADO记录集
IStreamPtr pStream; //定义IStream对象
if (FAILED(CreateTestRS(&rs1))) //创建ADO记录集
{
printf("Couldn't create the first recordset\n");
goto exit;
}
//将ADO记录集rs1中的数据保存到IStream对象中
if (FAILED(SaveRS(rs1, (IStream**)&pStream)))
{
printf("Couldn't save the recordset\n");
goto exit;
}
//从IStream对象中的读取数据到ADO记录集rs2
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
//将rs2记录集从IStream对象中读取的数据显示出来
{
for (short i =0;i<rs2->Fields->Count;i++)
printf("Name of field %d is %s\n", i, (LPCTSTR) rs2->Fields->GetItem(i)->Name);
}
exit: //错误处理
printf("Press any key to end program\n");
getchar();
return 0;
}
//从零开始建立一个记录集
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;
}
//将ADO记录集中的数据保存到IStream对象中
HRESULT SaveRS(_RecordsetPtr pRS/*IN*/, IStream* * ppStream/*OUT*/)
{
HRESULT hr=S_OK;
try
{
*ppStream=NULL;
//在给定的_RecordsetPtr上调用QueryInterface接口,获取IPersistStream对象
IPersistStreamPtr pIPersist(pRS);//使用_RecordsetPtr的接口
if (pIPersist )
{
//创建一个标准的COM IStream 对象
if (FAILED(hr=CreateStreamOnHGlobal(0, TRUE, (IStream **)ppStream)))
return hr;
//调用COM函数将IPersistStream对象保存到IStream 对象
if (FAILED(hr=OleSaveToStream(pIPersist, *ppStream)))
return hr;
}
else
return E_NOINTERFACE;
}
catch (_com_error & e)
{
return e.Error();
}
return S_OK;
}
//从IStream对象中的读取数据到ADO记录集rs2
HRESULT LoadRS(_Recordset* *ppRS/*OUT*/, IStreamPtr pStream/*IN*/)
{
HRESULT hr=S_OK;
try
{
*ppRS=NULL;
if (NULL==pStream)
return E_NOINTERFACE;
LARGE_INTEGER li;
li.QuadPart = 0;
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;
}
上一篇:
ADOWin32ConsoleCaptureEvent.cpp
下一篇:
西班牙语童话:El Alimento de Dios