c++ ado 怎么调用存储过程,返回结构集 如一个表 ^_^大家 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 能细说一下吗?ADO很多操作都是返回的是记录集呀~ http://www.cppblog.com/rick/archive/2006/07/15/9916.aspx create procedure prrr@name varchar(20)asselect * from person where name like '['+@name+']%'GO存储过程是 先看http://www.vckbase.com/document/viewdoc/?id=496cstring str;str.format("exec prrr %s",参数name)m_pRecordset->open(str,....,adCmdStoredProc)试试看 文章不是我写的,是我搜集的。希望对你有帮助 在ADO中调用存储过程一直是一个困扰大家的问题。 其实,关于ADO调用存储过程的 方法在很多书中都有讲到,标准的做法无非是按照以下步骤进行: 1、生成并初始化一个_CommandPtr对象; 2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象; 3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数和输出参数); 4、为_CommandPtr对象指定需要使用的ADO连接; 5、使用_CommandPtr的Execute方法调用存储过程; 6、从结果中获取返回参数的值(如果有的话)。 对于CreateParameter函数: CreateParameter (Name, Type, Direction, Size, Value) 其中Name是参数的名称,可以指定也可以不指定; Type是一个DataTypeEnum值,指定参数的类别,取值有adInteger(整型)、adChar(字符/字符串型)等; Direction是一个ParameterDirectionEnum值,其取值为adParamInput、adParamInputOutput、 adParamOutput、adParamReturnValue、adParamUnknown; Size是一个Long类型的值,指示该参数值以字节计算的最大长度,例如对int型,该值可以取为sizeof(int), 对Long型,该值可以取为sizeof(long),对字符串型,可以使用该字符串的长度; Value是一个variant类型的值,是该参数的取值。 在这里需要注意的是,Type参数、Direction参数以及Size参数一定要和存储过程定义时的参数相吻合, 如果有下面一个存储过程 CREATE PROCEDURE SMS_Proc_Handle_All ( @UserID Integer, @SourAddr Varchar(15), @DestAddr varchar(5000), @AvValue Single output, @ReturnInfo varchar(100) output ) 则Type参数的取值依次为adInteger、adChar、adChar、adSingle,adChar; Direction参数的取值依次为adParameterIn、adParameterIn、adParameterIn、adParameterOut、adParameterOut; 对于输入参数,Size的值可以根据实际数值来定, 对于输出参数,最好是根据定义确定(上例中ReturnInfo参数的 Size值可以取为100)。 以下是一个通过ADO调用存储过程的部分代码: _CommandPtr cmmd; HRESULT hr = cmmd.CreateInstance(__uuidof(Command)); if(FAILED(hr)) { AfxMessageBox("NewNetDatabase()中创建_CommandPtr对象失败"); return 0; } _ParameterPtr param; param = cmmd->CreateParameter(""/*NetType*/,adTinyInt, adParamInput, sizeof(BYTE),(BYTE)(m_nNetType+1)); cmmd->Parameters->Append(param); param = cmmd->CreateParameter(""/*Name*/,adVarChar, adParamInput, m_strName.GetLength()+1, _variant_t(m_strName)); cmmd->Parameters->Append(param); param = cmmd->CreateParameter(""/*Desp*/,adVarChar, adParamInput, m_strDesp.GetLength()+1, _variant_t(m_strDesp)); cmmd->Parameters->Append(param); //返回参数,返回新建的网络的ID param = cmmd->CreateParameter("NewNetID"/*NetID*/,adInteger, adParamOutput, sizeof(long), (long)m_nNewNetID); cmmd->Parameters->Append(param); cmmd->CommandText=_bstr_t("GSDT_NewNet");//存储过程的名称 cmmd->ActiveConnection = m_pConPtr;//需要使用的ADO连接 cmmd->CommandType=adCmdStoredProc; cmmd->Execute(NULL, NULL, adCmdStoredProc); m_nNewNetID=(long)cmmd->Parameters->GetItem("NewNetID")->GetValue();//通过参数返回值 cmmd.Detach(); 用c/c++定位删除一行的问题。 CAxWindow接口CreateControl()有时候返回“类别已存在”错误,是什么原因? no overloaded function takes 9 parameters 什么意思? 获取本机网络信息 高兴,散分~ 懂myicq的请进! 被吓出一身冷汗,失而复得的感觉真好,散分 关于程序变速的问题=====高分求知!!!!!! 请问CreateProcess()参数的解释 如何获取高精度的时间? 请教一个显示图像的问题 CString::Find如何使用(保证有分)
ADO很多操作都是返回的是记录集呀~
@name varchar(20)
as
select * from person where name like '['+@name+']%'GO
存储过程是
cstring str;
str.format("exec prrr %s",参数name)
m_pRecordset->open(str,....,adCmdStoredProc)试试看
在ADO中调用存储过程一直是一个困扰大家的问题。
其实,关于ADO调用存储过程的
方法在很多书中都有讲到,标准的做法无非是按照以下步骤进行:
1、生成并初始化一个_CommandPtr对象;
2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象;
3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数和输出参数);
4、为_CommandPtr对象指定需要使用的ADO连接;
5、使用_CommandPtr的Execute方法调用存储过程;
6、从结果中获取返回参数的值(如果有的话)。
对于CreateParameter函数:
CreateParameter (Name, Type, Direction, Size, Value)
其中Name是参数的名称,可以指定也可以不指定;
Type是一个DataTypeEnum值,指定参数的类别,取值有adInteger(整型)、adChar(字符/字符串型)等;
Direction是一个ParameterDirectionEnum值,其取值为adParamInput、adParamInputOutput、 adParamOutput、adParamReturnValue、adParamUnknown;
Size是一个Long类型的值,指示该参数值以字节计算的最大长度,例如对int型,该值可以取为sizeof(int), 对Long型,该值可以取为sizeof(long),对字符串型,可以使用该字符串的长度; Value是一个variant类型的值,是该参数的取值。
在这里需要注意的是,Type参数、Direction参数以及Size参数一定要和存储过程定义时的参数相吻合,
如果有下面一个存储过程
CREATE PROCEDURE SMS_Proc_Handle_All
(
@UserID Integer,
@SourAddr Varchar(15),
@DestAddr varchar(5000),
@AvValue Single output,
@ReturnInfo varchar(100) output
)
则Type参数的取值依次为adInteger、adChar、adChar、adSingle,adChar;
Direction参数的取值依次为adParameterIn、adParameterIn、adParameterIn、adParameterOut、adParameterOut;
对于输入参数,Size的值可以根据实际数值来定,
对于输出参数,最好是根据定义确定(上例中ReturnInfo参数的 Size值可以取为100)。
以下是一个通过ADO调用存储过程的部分代码:
_CommandPtr cmmd;
HRESULT hr = cmmd.CreateInstance(__uuidof(Command));
if(FAILED(hr))
{
AfxMessageBox("NewNetDatabase()中创建_CommandPtr对象失败");
return 0;
}
_ParameterPtr param;
param = cmmd->CreateParameter(""/*NetType*/,adTinyInt, adParamInput, sizeof(BYTE),(BYTE)(m_nNetType+1));
cmmd->Parameters->Append(param);
param = cmmd->CreateParameter(""/*Name*/,adVarChar, adParamInput, m_strName.GetLength()+1, _variant_t(m_strName));
cmmd->Parameters->Append(param);
param = cmmd->CreateParameter(""/*Desp*/,adVarChar, adParamInput, m_strDesp.GetLength()+1, _variant_t(m_strDesp)); cmmd->Parameters->Append(param);
//返回参数,返回新建的网络的ID
param = cmmd->CreateParameter("NewNetID"/*NetID*/,adInteger, adParamOutput, sizeof(long), (long)m_nNewNetID);
cmmd->Parameters->Append(param);
cmmd->CommandText=_bstr_t("GSDT_NewNet");//存储过程的名称
cmmd->ActiveConnection = m_pConPtr;//需要使用的ADO连接
cmmd->CommandType=adCmdStoredProc;
cmmd->Execute(NULL, NULL, adCmdStoredProc);
m_nNewNetID=(long)cmmd->Parameters->GetItem("NewNetID")->GetValue();//通过参数返回值
cmmd.Detach();