您的位置:首页 > 编程语言 > C语言/C++

VC++ ADO调用存储过程方法

2012-10-20 23:06 375 查看
约定

斜体字体表示可变部分 斜体

红色字体表示固定部分 红体



以下步骤的前提条件:COM
ADO库已初始化,已经设置_ConnectionPtr连接对象。



步骤一: 创建 _CommandPtr 对象并初始化

_CommandPtr pCommand;

pCommand.CreateInstance(__uuidof(Command));



步骤二:设置_CommandPtr 对象的属性

1)设置连接字符串

pCommand->ActiveConnection = < _ConnectionPtr 类型的变量>;//连接字符串

例如:pCommand->ActiveConnection = m_OraDateBase.m_pConnection;



2) 标记该操作为存储过程 (如果存储过程输出参数为记录集,忽略此步骤)

pCommand->CommandType = adCmdStoredProc;



3)设置PLSQLRSet属性(如果存储过程输出参数不是记录集,忽略此步骤)

pCommand->Properties->GetItem("PLSQLRSet")->Value = true;


步骤三:设置存储过程的输入/输出参数(如果没有输入参数忽略此步骤)

1) 创建 _ParameterPtr对象并初始化

_ParameterPtr pParam;

pParam.CreateInstance(__uuidof(Parameter));



2)设置_ParameterPtr对象的变量相关参数

pParam = pCommand->CreateParameter(<变量名称>,

<变量类型>,

<创建类型>,

<变量大小>);

<变量名称> : 这个名称会在取数据的时候用到

<变量类型> :变量类型可以参考以下网页:

http://school.it168.com/special/manual/ado/index.htm?url=/special/manual/ado/html/mdidxparametervcppsyntax.htm


<创建类型>:输入参数为:adParamInput 输出参数为:adParamOutput

<变量大小> :例如int为4 ,
字符串为字符串的长度



例如:

pParam = pCommand->CreateParameter(_bstr_t("GAMEID"),

adInteger,

adParamInput,

4);

pParam = pCommand->CreateParameter(_bstr_t("val"),

adInteger,

adParamOutput,

4);



3)设置传入的变量值 (如果是输出参数忽略此步骤)

pParam->Value = _variant_t(< 变量值>);

< 变量值> : 要设置的数值



4)加入到Command对象的参数集属性中

pCommand->Parameters->Append(< 参数对象名>);

例如:

pCommand->Parameters->Append(pParam);



步骤四: 执行存储过程(返回记录集的情况)

1) 设置要调用的存储过程名称

pCommand->CommandText = _bstr_t(<存储过程名称>(?));

<存储过程名称>:为数据库中存储过程的名称

?的个数为输入参数的个数,例如有三个输入参数,调用格式如下:

pCommand->CommandText = _bstr_t(<存储过程名称>(?,?,?));



如下图:







3) 执行调用

<记录集对象指针> =

pCommand->Execute(NULL,NULL,adCmdStoredProc
| adCmdUnspecified);

例如:

m_OraDateBase.m_pTempRecord = pCommand->Execute(NULL,NULL,adCmdStoredProc | adCmdUnspecified);







步骤四: 执行存储过程(一般情况)

1) 设置要调用的存储过程名称

pCommand->CommandText = _bstr_t(<存储过程名称>);

<存储过程名称>:为数据库中存储过程的名称



如下图:







例如:

pCommand->CommandText = _bstr_t("RP_KEYWORDS_STATISTICS");



2) 执行调用

pCommand->Execute(NULL,NULL,adCmdStoredProc);



步骤五:获取输出参数结果

<变量名> = pCommand->Parameters->GetItem(<输出参数名>)->GetValue();



<变量名> :为C++中接收输出值的变量名

<输出参数名> :为设置输出参数时设置的变量名称







完整调用示例:

存储过程代码:

create or replace procedure RP_KEYWORDS_STATISTICS

(

v_keywords varchar2

)

IS

num number;

begin

select count(*) into num from t_keywords where c_keycontent=v_keywords;

if num=0 then

insert into t_keywords select sequence_keywords.nextval,v_keywords,1 from dual;

elsif num>0 then

update t_keywords set i_num=i_num+1 where c_keycontent=v_keywords;

end if;



commit;

end RP_KEYWORDS_STATISTICS;

C++ADO调用代码:

void CExecuteSql::LogUserSearchKey(std::string strKey)

{

std::string strProcName;

_CommandPtr pCommand;

int iExpVal;



try {



pCommand.CreateInstance(__uuidof(Command));



pCommand->ActiveConnection = m_OraDateBase.m_pConnection;//连接字符串

pCommand->CommandType = adCmdStoredProc;//标记该操作为存储过程



_variant_t vt;

vt.SetString("2");

_ParameterPtr pParam, pParam1;

pParam.CreateInstance(__uuidof(Parameter));

pParam = pCommand->CreateParameter(_bstr_t("keyval"),adChar,adParamInput,strKey.length());//给参数设置各属性

pParam->Value = _variant_t( strKey.c_str()
);

pCommand->Parameters->Append(pParam);//加入到Command对象的参数集属性中



pCommand->CommandText = _bstr_t("RP_KEYWORDS_STATISTICS");//存储过程名



pCommand->Execute(NULL,NULL,adCmdStoredProc);



//iExpVal
= pCommand->Parameters->GetItem("val")->GetValue();



} catch (_com_error e)
{

CString m_strErrMsg;

m_strErrMsg.Format("LogUserSearchKey
failure!\r\n\r\n message error:%s\r\n\r\n",e.ErrorMessage());

printf("%s\n", m_strErrMsg.GetBuffer());

IsDatabaseClose();

iExpVal =
0;

//shGameCoin
= 0;

return ;

}



return ;

}





【参考】

程序中调用的ADO函数的具体可用参数值可参考以下文档:

Microsoft ADO 程序员参考

http://www.yesky.com/imagesnew/software/ado/index.html

C++中的Parameter类型和ADO的类型换转

http://blog.sina.com.cn/s/blog_53061af00100miqs.html



VC ADO

http://www.pconline.com.cn/pcedu/empolder/gj/vc/0507/653859.html

http://www.vckbase.com/document/viewdoc/?id=496

http://zhidao.baidu.com/question/87587746.html

http://bbs.blueidea.com/thread-2007722-1-1.html

http://hi.baidu.com/������01/blog/item/a5b0bd0873b9129d0b7b821d.html

本人转载出处:http://blog.sina.com.cn/s/blog_600ce18b0100urzx.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: