高分请教:ADO调用存储过程,参数传递顺序导致数据类型转换错误

scsnsjsl_cs_dn scsnsjsl_cs_dn 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
有存储过程如下
create proc PROC_A(
@id int,
@name varchar(20)
)
as
begin
select * from ttt where id = @id and name = @name;
end

create proc PROC_B(
@name varchar(20),
@id int
)
as
begin
select * from ttt where id = @id and name = @name;
end


C++代码如下:
_CommandPtr						m_DBCommand;						//命令对象
_RecordsetPtr m_DBRecordset; //记录集对象
_ConnectionPtr m_DBConnection; //数据库对象

//连接数据库
_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Server=%s;Database=%s;Uid=%s;pwd=%s;"),
szDBAddr,szDBName,szUser,szPassword);
m_DBConnection->Open(_bstr_t(m_strConnect), L"", L"", adConnectUnspecified)
m_DBConnection->CursorLocation = adUseClient;
m_DBCommand->ActiveConnection = m_DBConnection;

{
//输出参数
_ParameterPtr Parameter = m_DBCommand->CreateParameter(TEXT("RETURN_VALUE"), adInteger, adParamReturnValue, sizeof(long), _variant_t((long)0));
m_DBCommand->Parameters->Append(Parameter);
}

{
_ParameterPtr Parameter = m_DBCommand->CreateParameter("id", adInteger, adParamInput, sizeof(long), _variant_t((long)1));
m_DBCommand->Parameters->Append(Parameter);
}

{
const char *pName = "bill";
_ParameterPtr Parameter = m_DBCommand->CreateParameter("name", adChar, adParamInput, lstrlen(pName), _variant_t(pName));
m_DBCommand->Parameters->Append(Parameter);
}

m_DBCommand->CommandText = "PROC_A";
m_DBRecordset->PutRefSource(m_DBCommand);
m_DBRecordset->CursorLocation = adUseClient;
m_DBRecordset->Open((IDispatch *)m_DBCommand, vtMissing, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified);

参数传递顺序,依次是:int 类型的ID,varchar类型的name
如果调用PROC_A,正确执行
如果调用PROC_B,在调用最后一句:m_DBRecordset->Open则报错:ADO 错误:0x80040e07,从数据类型 char 转换为 int 时出错,捕获的异常是DB_E_CANTCONVERTVALUE
PROC_A和PROC_B仅仅是两个参数顺序不同

想问的问题是,ADO调用程序存储过程传递参数的顺序必须和存储过程参数一样吗?
既然要顺序一直,为何还要求传递参数的时候带上参数名字
...全文
评论 10
收藏 已收藏
分享
返回顶部
scsnsjsl_cs_dn
VC/MFC 16,550 成员 421,606 内容