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

scsnsjsl_cs_dn 2014-04-19 01:20:17
有存储过程如下
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调用程序存储过程传递参数的顺序必须和存储过程参数一样吗?
既然要顺序一直,为何还要求传递参数的时候带上参数名字
...全文
222 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzflystar 2016-08-11
  • 打赏
  • 举报
回复
参数设置必须按顺序来。名字的意义在于C++程序中方便定位Parameters->item("参数名")。另外,名字可以随意取值,不需要与存储过程的名字一样!
worldy 2014-04-21
  • 打赏
  • 举报
回复
是啊,赋值在VB可以直接使用等号,在VC应该使用接口函数
scsnsjsl_cs_dn 2014-04-21
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
m_DBCommand有Parameters集合,通过集合可以按照名称访问各个参数,为参数赋值,然后调用Execute
你的意思是直接通过对m_DBCommand有Parameters集合访问,进行赋值
scsnsjsl_cs_dn 2014-04-21
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
另外,Command对象的连接是连到sql数据库,应该可以指定已经在数据库的存储过程的名称,然后设置活动连接,这样,Command应该就可以自己加载参数,不需要CreateParameter,在VB中这样使用没有问题,但VC中,我没有试,你可以试试看
能给出例子或者详细点吗
worldy 2014-04-21
  • 打赏
  • 举报
回复
另外,Command对象的连接是连到sql数据库,应该可以指定已经在数据库的存储过程的名称,然后设置活动连接,这样,Command应该就可以自己加载参数,不需要CreateParameter,在VB中这样使用没有问题,但VC中,我没有试,你可以试试看
worldy 2014-04-21
  • 打赏
  • 举报
回复
m_DBCommand有Parameters集合,通过集合可以按照名称访问各个参数,为参数赋值,然后调用Execute
scsnsjsl_cs_dn 2014-04-21
  • 打赏
  • 举报
回复
引用 8 楼 worldy 的回复:
j加个语句:
void Test()
{
	_CommandPtr cmd;
	cmd.CreateInstance(__uuidof(Command));
	cmd->PutCommandType(CommandTypeEnum::adCmdStoredProc);
	cmd->put_CommandText(_bstr_t("aProc"));
	cmd->PutActiveConnection(_variant_t(cnt));
	cmd->Parameters->Refresh();

	TRACE("Param count:%d\n",cmd->Parameters->GetCount());
	cmd->Parameters->Item[_bstr_t("pName")]->Value=_variant_t(theValue);
	_variant_t aff;
	...
		cmd->Execute(&aff,NULL,-1);
}
谢谢
worldy 2014-04-21
  • 打赏
  • 举报
回复
j加个语句:
void Test()
{
	_CommandPtr cmd;
	cmd.CreateInstance(__uuidof(Command));
	cmd->PutCommandType(CommandTypeEnum::adCmdStoredProc);
	cmd->put_CommandText(_bstr_t("aProc"));
	cmd->PutActiveConnection(_variant_t(cnt));
	cmd->Parameters->Refresh();

	TRACE("Param count:%d\n",cmd->Parameters->GetCount());
	cmd->Parameters->Item[_bstr_t("pName")]->Value=_variant_t(theValue);
	_variant_t aff;
	...
		cmd->Execute(&aff,NULL,-1);
}
worldy 2014-04-21
  • 打赏
  • 举报
回复
应该差不多是这样,你试试看
void Test()
{
	_CommandPtr cmd;
	cmd.CreateInstance(__uuidof(Command));
	cmd->PutCommandType(CommandTypeEnum::adCmdStoredProc);
	cmd->put_CommandText(_bstr_t("aProc"));
	cmd->PutActiveConnection(_variant_t(cnt));
	TRACE("Param count:%d\n",cmd->Parameters->GetCount());
	cmd->Parameters->Item[_bstr_t("pName")]->Value=_variant_t(theValue);
	_variant_t aff;
...
	cmd->Execute(&aff,NULL,-1);
}
scsnsjsl_cs_dn 2014-04-20
  • 打赏
  • 举报
回复
自己 顶下

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧