ADO操作总结(一)

2015-11-21 01:57:53 · 作者: · 浏览: 17
#pragma once
#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEof")
#include 
#include 

#ifdef _UNICODE
typedef std::wstring _tstring;
#else
typedef std::string _tstring;
#endif

/* 使用Recordset 注意事项 
*http://www.w3school.com.cn/ado/ado_ref_recordset.asp
*http://www.cnblogs.com/fickleness/p/3149016.html
*使用完需要close and xx.Release(); 
*	if(pRecord->State)//校验数据库是否打开
*	{
*		pRecord->Close();
*	}
*	pRecord.Release();
*Recordset 属性取决于提供者的功能和游标类型。对于仅向前游标,RecordCount 属性将返回 -1;
*对于静态或键集游标,将返回实际计数;
*而对于动态游标,则返回 -1 或实际计数,这取决于数据源。
*如果 ADO 无法确定记录数目或者提供者或游标类型不支持 RecordCount,则该属性返回 -1
*BOF,EOF属性:BOF指示当前记录位置的第一记录的前一个,EOF指示当前记录的最后一个记录的后一个
*打开 Recordset 时,如果有记录 BOF 和 EOF 属性被设置为 False。如果没有记录,BOF 和 EOF 属性设置是 True。
*State 返回一个值,此值可描述是否 Recordset 对象是打开、关闭、正在连接、正在执行或正在取回数据
*m_pRecordset->GetCollect(_variant_t(long (i))) //必须是long 否则出错 
或者VARIANT vt;
vt.vt = VT_I4;
vt.intVal = i;
或者
m_pRecordset->GetCollect("username")

m_pConnect.GetInterfacePtr();
*/
	
/*使用存储过程注意事项:
*参考文章:http://blog.csdn.net/jackalfly/article/details/8558937
*此连接对象必须被设置为:m_pConnection->CursorLocation =adUseClient
*如果不设置,那么在取return和output参数的时候,必须关闭关闭记录集以后才能取。
*否则return和output就不回取到正确的值。设成adUseClient就ok了。
*如果Execute()方法设置了游标该设置,那么Recordset 将从连接中继承该设置。
*例如:如果m_pConnection->CursorLocation=adUseClient,那么记录集也是adUseClient的了
*/

typedef struct structStoreProcParam
{
	_tstring szParamName;//> 参数名称
	DataTypeEnum DataType;//> 数据类型
	int DataSize;//> 如果是固定长度的类型,就填-1或者sizeof,如果是字符串等可变长度的就填其实际长度+1。 
	ParameterDirectionEnum Direction;//>   输入还是输出参数
	_variant_t strVal;//> 参数的值 对于Int之类的以后扩展
}structStoreProcParam;


class CAdo
{
public:
	CAdo(void);
	~CAdo(void);

	/*
	* 打开
数据库
,内部设置了游标类型为adUserClient */ virtual bool Open(TCHAR *szConnectString); /* * 执行Sql语句也可以是存储过程 * @param szExecSql 执行的Sql语句或者存储过程 * @param [Out]recordseffected 受影响的行数 select op 返回-1 因为没有设置游标类型 * @param [in]Parameters 存储过程参数 * @param [in]nCountParam 存储过程的个数,个数<=100 * @ret _RecordsetPtr 当不适用的时候记得调用 .Release();//释放引用计数 */ _RecordsetPtr Exec(TCHAR *szExecSql,VARIANT *recordseffected,CommandTypeEnum = adCmdText,structStoreProcParam *Parameters = NULL,int nCountParam = 0); /* *记录集的打开 一般对select 使用 * @param [in]szSelectSql Select 参数 * @param [Out]pRes 返回记录集 * @ret 是否成功 * 记录集使用完之后请调用 ->Close 和.Release 释放资源 */ bool OpenRecorder(TCHAR *szSelectSql,_RecordsetPtr &pRes,CursorTypeEnum CursorType = adOpenStatic,LockTypeEnum LockType = adLockOptimistic); /* * 记录集其他操作根据需求扩展 */ /* * 获取存储过程的param 的Val */ bool GetStoreProcParamVal(TCHAR *szParamName,VARIANT &val); /* * 获取记录集的Fileds */ bool GetFiledsCount(_RecordsetPtr &pRes,long *lFiledsCount); bool GetFileds(_RecordsetPtr &pRes,std::vector<_tstring> &vTitle); /* * 获取某记录集的个数 select count(*) from */ bool GetRecordSetCount(TCHAR *szExeSql,long &lcout); /* * 获取错误信息 */ const TCHAR *GetLastError(){return m_LastError;}; private: _ConnectionPtr m_pConnect; //_RecordsetPtr m_pRecorderset; _CommandPtr m_pCommand; TCHAR m_LastError[1024]; };

//ADO.cpp#include "StdAfx.h"

#include "StdAfx.h"
#include "Ado.h"
#include 

#define ADOERR(err)\
_tcscpy_s(m_LastError,1024,err);

CAdo::CAdo(void)
{
	memset(m_LastError,0,sizeof(TCHAR)*1024);
	HRESULT hr = m_pConnect.CreateInstance(_T("ADODB.Connection"));
	assert(SUCCEEDED(hr));
	hr = m_pCommand.CreateInstance(_T("ADODB.Command"));
	assert(SUCCEEDED(hr));
// 	hr = m_pRecorderset.CreateInstance(_T("ADODB.Recordset"));
// 	assert(SUCCEEDED(hr));
}


CAdo::~CAdo(void)
{
	///> 如