E-RowsetObject

本文详细介绍了如何利用OLE DB接口实现数据库连接、命令执行、属性设置及结果集交互等功能,包括创建和使用IDBCreateCommand、ICommand、ICommandText等关键对象,以及如何获取和操作Rowset对象的接口,如IAccessor、IColumnsInfo、IRowset等,以实现数据的读取、更新和查找。通过实例代码展示了设置属性、执行SQL语句、获取Rowset对象并验证其接口支持的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序演示了 如何从Command对象得到一个Rowset对象,并通过Query。 Rowset 对象的所有接口的方式来了解具体的属对

对Rowset对象接口的影响。


程序如下:

#include <tchar.h>
#include <windows.h>
#include <strsafe.h>

#define COM_NO_WINDOWS_H    //如果已经包含了Windows.h或不使用其他Windows库函数时
#define DBINITCONSTANTS
#define INITGUID
#define OLEDBVER 0x0260		//为了ICommandStream接口定义为2.6版
#include <oledb.h>
#include <oledberr.h>
#include <msdasc.h>

#define GRS_ALLOC(sz)		HeapAlloc(GetProcessHeap(),0,sz)
#define GRS_CALLOC(sz)		HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sz)
#define GRS_SAFEFREE(p)		if(NULL != p){HeapFree(GetProcessHeap(),0,p);p=NULL;}

#define GRS_USEPRINTF() TCHAR pBuf[1024] = {}
#define GRS_PRINTF(...) \
	StringCchPrintf(pBuf,1024,__VA_ARGS__);\
	WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),pBuf,lstrlen(pBuf),NULL,NULL);

#define GRS_SAFERELEASE(I) if(NULL != I){I->Release();I=NULL;}
#define GRS_COM_CHECK(hr,...) if(FAILED(hr)){GRS_PRINTF(__VA_ARGS__);goto CLEAR_UP;}


#define GRS_DEF_INTERFACE(i) i* p##i = NULL;
#define GRS_QUERYINTERFACE(i,iid) \
	if(FAILED(hr = i->QueryInterface(IID_##iid, (void **)&p##iid)) )\
	{\
	GRS_PRINTF(_T("不支持'%s'接口\n"),_T(#iid));\
	}\
	else\
	{\
	GRS_PRINTF(_T("支持'%s'接口\n"),_T(#iid));\
	}\
	GRS_SAFERELEASE(p##iid);

BOOL CreateDBSession(IOpenRowset* &pIOpenRowset);

int _tmain()
{
	GRS_USEPRINTF();
	CoInitialize(NULL);
	HRESULT hr=S_OK;
	IOpenRowset* pIOpenRowset=NULL;
	IDBCreateCommand* pIDBCreateCommand=NULL;

	ICommand* pICommand=NULL;
	ICommandText * pICommandText=NULL;
	ICommandProperties* pICommandProperties=NULL;

	GRS_DEF_INTERFACE(IAccessor);
	GRS_DEF_INTERFACE(IColumnsInfo);
	GRS_DEF_INTERFACE(IConvertType);
	GRS_DEF_INTERFACE(IRowset);
	GRS_DEF_INTERFACE(IRowsetInfo);
	GRS_DEF_INTERFACE(IChapteredRowset);
	GRS_DEF_INTERFACE(IColumnsInfo2);
	GRS_DEF_INTERFACE(IColumnsRowset);
	GRS_DEF_INTERFACE(IConnectionPointContainer);
	GRS_DEF_INTERFACE(IDBAsynchStatus);
	GRS_DEF_INTERFACE(IGetRow);
	GRS_DEF_INTERFACE(IRowsetChange);
	GRS_DEF_INTERFACE(IRowsetChapterMember);
	GRS_DEF_INTERFACE(IRowsetCurrentIndex);
	GRS_DEF_INTERFACE(IRowsetFind);
	GRS_DEF_INTERFACE(IRowsetIdentity);
	GRS_DEF_INTERFACE(IRowsetIndex);
	GRS_DEF_INTERFACE(IRowsetLocate);
	GRS_DEF_INTERFACE(IRowsetRefresh);
	GRS_DEF_INTERFACE(IRowsetScroll);
	GRS_DEF_INTERFACE(IRowsetUpdate);
	GRS_DEF_INTERFACE(IRowsetView);
	GRS_DEF_INTERFACE(ISupportErrorInfo);
	GRS_DEF_INTERFACE(IRowsetBookmark);

	//TCHAR*  PSQL=_T("insert into student values('liujxao','38')");
	TCHAR*  PSQL=_T("select * from student");
	DBPROPSET ps[1]={};
	DBPROP prop[20]={};

	if (!CreateDBSession(pIOpenRowset))
	{
		_tsystem(_T("PAUSE"));
		return -1;
	}

	hr=pIOpenRowset->QueryInterface(IID_IDBCreateCommand,(void**)&pIDBCreateCommand);
	GRS_COM_CHECK(hr,_T("获取IDBCreateCommand接口失败"));
	hr=pIDBCreateCommand->CreateCommand(NULL,IID_ICommand,(IUnknown**)&pICommand);
	GRS_COM_CHECK(hr,_T("创建ICommand接口失败"));

	//执行一个命令
	hr=pICommand->QueryInterface(IID_ICommandText,(void**)&pICommandText);
	GRS_COM_CHECK(hr,_T("获取ICommandText接口失败"));
	hr=pICommandText->SetCommandText(DBGUID_DEFAULT,PSQL);
	GRS_COM_CHECK(hr,_T("设置SQL语句失败"));

	//设置属性
	prop[0].dwPropertyID=DBPROP_UPDATABILITY;
	prop[0].vValue.vt=VT_I4;
	//设置执行后的结果集可以进行增删改查
	prop[0].vValue.lVal=DBPROPVAL_UP_CHANGE
		|DBPROPVAL_UP_INSERT
		|DBPROPVAL_UP_DELETE;
	prop[0].dwOptions=DBPROPOPTIONS_REQUIRED;
	prop[0].colid=DB_NULLID;

	//申请打开书签功能
	prop[1].dwPropertyID=DBPROP_BOOKMARKS;
	prop[1].vValue.vt=VT_BOOL;
	prop[1].vValue.boolVal=VARIANT_TRUE;
	prop[1].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[1].colid=DB_NULLID;

	//申请打开查找功能
	prop[2].dwPropertyID=DBPROP_IRowsetFind;
	prop[2].vValue.vt=VT_BOOL;
	prop[2].vValue.boolVal=VARIANT_TRUE;
	prop[2].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[2].colid=DB_NULLID;

	//申打开行索引
	prop[3].dwPropertyID=DBPROP_IRowsetIndex;
	prop[3].vValue.vt=VT_BOOL;
	prop[3].vValue.boolVal=VARIANT_TRUE;
	prop[3].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[3].colid=DB_NULLID;

	// 申请打开行定位功能
	prop[4].dwPropertyID=DBPROP_IRowsetLocate;
	prop[4].vValue.vt=VT_BOOL;
	prop[4].vValue.boolVal=VARIANT_TRUE;
	prop[4].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[4].colid=DB_NULLID;

	//申请打开行滚动功能 
	prop[5].dwPropertyID=DBPROP_IRowsetScroll;
	prop[5].vValue.vt=VT_BOOL;
	prop[5].vValue.boolVal=VARIANT_TRUE;
	prop[5].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[5].colid=DB_NULLID;

	//申请打开行集视图功能
	prop[6].dwPropertyID=DBPROP_IRowsetView;
	prop[6].vValue.vt=VT_BOOL;
	prop[6].vValue.boolVal=VARIANT_TRUE;
	prop[6].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[6].colid=DB_NULLID;

	//申请打开行集刷新功能
	prop[7].dwPropertyID=DBPROP_IRowsetRefresh;
	prop[7].vValue.vt=VT_BOOL;
	prop[7].vValue.boolVal=VARIANT_TRUE;
	prop[7].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[7].colid=DB_NULLID;

	//申请打开列信息扩展接口 
	prop[8].dwPropertyID=DBPROP_IColumnsInfo2;
	prop[8].vValue.vt=VT_BOOL;
	prop[8].vValue.boolVal=VARIANT_TRUE;
	prop[8].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[8].colid=DB_NULLID;

	//申请打开数据库同步状态接口
	prop[9].dwPropertyID=DBPROP_IDBAsynchStatus;
	prop[9].vValue.vt=VT_BOOL;
	prop[9].vValue.boolVal=VARIANT_TRUE;
	prop[9].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[9].colid=DB_NULLID;

	//申请打开行集分章功能
	prop[10].dwPropertyID=DBPROP_IChapteredRowset;
	prop[10].vValue.vt=VT_BOOL;
	prop[10].vValue.boolVal=VARIANT_TRUE;
	prop[10].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[10].colid=DB_NULLID;

	prop[11].dwPropertyID=DBPROP_IRowsetCurrentIndex;
	prop[11].vValue.vt=VT_BOOL;
	prop[11].vValue.boolVal=VARIANT_TRUE;
	prop[11].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[11].colid=DB_NULLID;

	prop[12].dwPropertyID=DBPROP_IGetRow;
	prop[12].vValue.vt=VT_BOOL;
	prop[12].vValue.boolVal=VARIANT_TRUE;
	prop[12].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[12].colid=DB_NULLID;

	//申请打开行集更新功能
	prop[13].dwPropertyID=DBPROP_IRowsetUpdate;
	prop[13].vValue.vt=VT_BOOL;
	prop[13].vValue.boolVal=VARIANT_TRUE;
	prop[13].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[13].colid=DB_NULLID;

	prop[14].dwPropertyID=DBPROP_IConnectionPointContainer;
	prop[14].vValue.vt=VT_BOOL;
	prop[14].vValue.boolVal=VARIANT_TRUE;
	prop[14].dwOptions=DBPROPOPTIONS_OPTIONAL;
	prop[14].colid=DB_NULLID;

	ps[0].guidPropertySet=DBPROPSET_ROWSET;
	ps[0].cProperties=15;
	ps[0].rgProperties=prop;


	hr=pICommandText->QueryInterface(IID_ICommandProperties,(void**)&pICommandProperties);
	GRS_COM_CHECK(hr,_T("获取ICommandProperties接口失败"));
	hr=pICommandProperties->SetProperties(1,ps);
	GRS_COM_CHECK(hr,_T("设置Command对象属性失败"));
	hr=pICommandText->Execute(NULL,IID_IRowsetChange,NULL,NULL,(IUnknown**)&pIRowsetChange);
	GRS_COM_CHECK(hr,_T("执行SQL语句失败"));


	GRS_QUERYINTERFACE(pIRowsetChange,IRowset);
	GRS_QUERYINTERFACE(pIRowsetChange,IAccessor);
	GRS_QUERYINTERFACE(pIRowsetChange,IColumnsInfo);
	GRS_QUERYINTERFACE(pIRowsetChange,IConvertType);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetInfo);
	GRS_QUERYINTERFACE(pIRowsetChange,IChapteredRowset);
	GRS_QUERYINTERFACE(pIRowsetChange,IColumnsInfo2);
	GRS_QUERYINTERFACE(pIRowsetChange,IColumnsRowset);
	GRS_QUERYINTERFACE(pIRowsetChange,IConnectionPointContainer);
	GRS_QUERYINTERFACE(pIRowsetChange,IDBAsynchStatus);
	GRS_QUERYINTERFACE(pIRowsetChange,IGetRow);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetCurrentIndex);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetIdentity);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetIndex);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetLocate);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetRefresh);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetScroll);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetUpdate);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetView);
	GRS_QUERYINTERFACE(pIRowsetChange,ISupportErrorInfo);
	GRS_QUERYINTERFACE(pIRowsetChange,IRowsetBookmark);


CLEAR_UP:
	GRS_SAFERELEASE(pIRowsetChange);
	GRS_SAFERELEASE(pICommandProperties);
	GRS_SAFERELEASE(pICommand);
	GRS_SAFERELEASE(pICommandText);
	GRS_SAFERELEASE(pIOpenRowset);
	GRS_SAFERELEASE(pIDBCreateCommand);
	return TRUE;
}

BOOL CreateDBSession(IOpenRowset* &pIOpenRowset)
{
	GRS_USEPRINTF();
	GRS_SAFERELEASE(pIOpenRowset);

	IDBPromptInitialize* pIDBPromtInitialize=NULL;
	IDBInitialize* pDBConnet=NULL;
	IDBCreateSession* pIDBCreateSession=NULL;


	HWND hWndParent=GetDesktopWindow();
	CLSID clsid={};
	//使用oledb 数据库连接对话框链接到数据源
	HRESULT hr=CoCreateInstance(CLSID_DataLinks,NULL,CLSCTX_INPROC_SERVER,
		IID_IDBPromptInitialize,(void**)&pIDBPromtInitialize);
	if (FAILED(hr))
	{
		GRS_PRINTF(_T("无法创建IDBPromptInitialize接口"),hr);
		GRS_SAFERELEASE(pDBConnet);
		GRS_SAFERELEASE(pIDBPromtInitialize);
		return FALSE;
	}

	//下面的将弹出数据库连接对话框
	hr=pIDBPromtInitialize->PromptDataSource(
		NULL,
		hWndParent,
		DBPROMPTOPTIONS_PROPERTYSHEET,
		0,
		NULL,
		NULL,
		IID_IDBInitialize,
		(IUnknown**)&pDBConnet);
	if (FAILED(hr))
	{
		GRS_PRINTF(_T("无法创建IDBPromptInitialize接口"),hr);
		GRS_SAFERELEASE(pDBConnet);
		GRS_SAFERELEASE(pIDBPromtInitialize);
		return FALSE;
	}
	GRS_SAFERELEASE(pIDBPromtInitialize);


	hr=pDBConnet->Initialize();//根据对话框采集到的参数链接到指定的数据库
	if (FAILED(hr))
	{
		GRS_PRINTF(_T("初始化数据源连接错误"));
		GRS_SAFERELEASE(pDBConnet);
		return FALSE;
	}

	if (FAILED(hr=pDBConnet->QueryInterface(IID_IDBCreateSession,(void**)&pIDBCreateSession)))
	{
		GRS_PRINTF(_T("获取IDBCreateSession接口失败"));
		GRS_SAFERELEASE(pIDBCreateSession);
		GRS_SAFERELEASE(pDBConnet);
		return FALSE;
	}
	GRS_SAFERELEASE(pDBConnet);

	hr=pIDBCreateSession->CreateSession(
		NULL,
		IID_IOpenRowset,
		(IUnknown**)&pIOpenRowset);
	if (FAILED(hr))
	{
		GRS_PRINTF(_T("创建Session对象获取IOpenRowset接口失败"));
		GRS_SAFERELEASE(pIDBCreateSession);
		GRS_SAFERELEASE(pIOpenRowset);
		return FALSE;
	}
	GRS_SAFERELEASE(pIDBCreateSession);
	GRS_SAFERELEASE(pDBConnet);
	return TRUE;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值