C-CommandObject

本文详细介绍了OLE DB中Command对象的状态转换、创建过程及其在不同状态间的转变。Command对象允许直接执行SQL语句或预处理SQL,提高了数据访问效率。

Command对象状态:

※根据SQL语句被设置和处理的过程,一个Command对象有以下4种状态:

Initial:初始状态

Unprepared:未预处理状态(已设置SQL,但没有预处理)

Prepared:已处理状态

Executed:已执行状态

※以上4个状态可以相互转化,已预处理状态有时可以被跳过

※可以直接执行SQL语句可以通过Command对象直接执行,而无需预处理。


Command对象的创建

※在拥有了Session对象之后就可以创建Command对象了

※一般通过QueryInterface出Session对象的IDBCreateCommand接口后,就可以创建Command对象了。

※需要注意的是IDBCreateCommand接口是个可选接口,这是因为并不是所有的OLEDB提供者都支持明亮处理(比如SQL语句处理),所以该接口为可选项。

※在使用Command对象时,一定要先确定能够从Session对象得到IDBCreateCommand接口。

※即使一个数据提供者不支持Command对象,依然可以通过直接打开数据对象的方法来操作器数据,这在后面讲结果集对象时介绍。

※记住一个Session对象可以创建多个Command对象。


代码如下:把连创建事物的方法封装起来了 封装到 CreateDBSession函数中。

#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;

	GRS_DEF_INTERFACE(IAccessor);
	GRS_DEF_INTERFACE(IColumnsInfo);
	GRS_DEF_INTERFACE(ICommand);
	GRS_DEF_INTERFACE(ICommandProperties);
	GRS_DEF_INTERFACE(ICommandText);
	GRS_DEF_INTERFACE(IConvertType);
	GRS_DEF_INTERFACE(IColumnsRowset);
	GRS_DEF_INTERFACE(ICommandPersist);
	GRS_DEF_INTERFACE(ICommandPrepare);
	GRS_DEF_INTERFACE(ICommandWithParameters);
	GRS_DEF_INTERFACE(ISupportErrorInfo);
	GRS_DEF_INTERFACE(ICommandStream);


	CreateDBSession(pIOpenRowset);

	hr=pIOpenRowset->QueryInterface(IID_IDBCreateCommand,(void**)&pIDBCreateCommand);
	GRS_COM_CHECK(hr,_T("获取IDBCreateCommand接口失败,错误码: 0x%08\n"),hr);
	hr=pIDBCreateCommand->CreateCommand(NULL,IID_ICommand,(IUnknown**)&pICommand);//ICommand 在command对象的属性里
	GRS_COM_CHECK(hr,_T("创建ICommand接口失败,错误码: 0x%08\n"),hr);
	GRS_PRINTF(_T("创建ICommand接口成功"));
CLEAR_UP:  
	GRS_SAFERELEASE(pIOpenRowset);  
	GRS_SAFERELEASE(pIDBCreateCommand);  
	GRS_SAFERELEASE(pICommand);  
	_tsystem(_T("PAUSE"));  
	CoUninitialize();  
	return 0;
}

BOOL CreateDBSession(IOpenRowset* &pIOpenRowset)//IOpenRowset在对象Session中
{
	GRS_USEPRINTF();
	GRS_SAFERELEASE(pIOpenRowset);

	IDBPromptInitialize*   pIDBPromptInitialize=NULL;
	IDBInitialize*               pDBConnect=NULL;
	IDBCreateSession*      pIDBCreateSession=NULL;

	HWND hWndParent=GetDesktopWindow();
	CLSID clsid={};
	//1使用OLEDB数据库连接对话框链接到数据源
	HRESULT hr=CoCreateInstance(CLSID_DataLinks,NULL,CLSCTX_INPROC_SERVER,IID_IDBPromptInitialize,(void**)&pIDBPromptInitialize);
	if (FAILED(hr))
	{
		GRS_PRINTF(_T("无法创建IDBPromptInitialize接口,错误码: 0x%08\n"),hr);
		GRS_SAFERELEASE(pDBConnect);
		GRS_SAFERELEASE(pIDBPromptInitialize);
		return FALSE;
	}
	//下面的这句将弹出数据库连接对话框
	//PromptDataSource opens the Data Link Properties dialog box
	hr=pIDBPromptInitialize->PromptDataSource(NULL,hWndParent,
		DBPROMPTOPTIONS_PROPERTYSHEET,0,NULL,NULL,IID_IDBInitialize,(IUnknown**)&pDBConnect);
	if (FAILED(hr))
	{
		GRS_PRINTF(_T("弹出数据源对话框错误,错误码: 0x%08\n"),hr);
		GRS_SAFERELEASE(pDBConnect);
		GRS_SAFERELEASE(pIDBPromptInitialize);
		return FALSE;
	}
	GRS_SAFERELEASE(pIDBPromptInitialize);

	hr=pDBConnect->Initialize();//根据对话框采集的参数连接到指定的数据库
	if (FAILED(hr))
	{
		GRS_PRINTF(_T("初始化数据源连接错误,错误码: 0x%08\n"),hr);
		GRS_SAFERELEASE(pDBConnect);
		return FALSE;
	}
	//pIDBCreateSession接口在 对象Session中 
	if (FAILED(hr=pDBConnect->QueryInterface(IID_IDBCreateSession,(void**)&pIDBCreateSession)))
	{
		GRS_PRINTF(_T("获取IDBCreateSession接口失败"));
		GRS_SAFERELEASE(pDBConnect);
		GRS_SAFERELEASE(pIDBCreateSession);
	}
	GRS_SAFERELEASE(pDBConnect);
	
	hr=pIDBCreateSession->CreateSession(NULL,IID_IOpenRowset,(IUnknown**)&pIOpenRowset);
	if (FAILED(hr))
	{
		GRS_PRINTF(_T(" 创建Session对象获取IOpenRowset接口失败,错误码: 0x%08\n"),hr);
		GRS_SAFERELEASE(pDBConnect);
		GRS_SAFERELEASE(pIDBPromptInitialize);
		GRS_SAFERELEASE(pIOpenRowset);
		return FALSE;
	}
	// 代表数据源连接的接口可以不要了,需要时可以通过Session对象的IGetDataSource接口获取
	GRS_SAFERELEASE(pDBConnect);
	GRS_SAFERELEASE(pIDBCreateSession);
	return TRUE;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值