■■■VC调用SQL SERVER2000存储过程之后……■■■

步履人生 2007-09-20 12:56:44
如下:
--------------------------------------------------------------------------
// 我的 存储过程
Create Procedure upMyProc
@sMyID NVARCHAR(20),
@nCount int output
As
SELECT * FROM My_Table WHERE ID=@sMyID
SELECT @nCount=@@ROWCOUNT

RETURN @@ERROR

/////////////////////////////////////////////////
// 下面是我的VC调用代码
extern adoConn;
_bstr_t sql="upMyProc";
_CommandPtr pCommand(__uuidof(Command));
_ParameterPtr pParam(__uuidof(Parameter));
_RecordsetPtr pRecordset(__uuidof(Recordset));

pCommand=NULL;
pCommand.CreateInstance("ADODB.Command");
pRecordset.CreateInstance("ADODB.Recordset");

if(pCommand==NULL)
return TRUE;
pCommand->put_ActiveConnection(_variant_t((IDispatch*)adoConn.GetConnection()));
pCommand->CommandText=sql;
pCommand->CommandType=adCmdStoredProc;

CString sID="HX01-SH-NH-HSDX-061128-01";
int nRec;

_variant_t vpid,vk;
vid=_variant_t(_bstr_t(sID));

vk.vt=VT_I4;
vk.lVal=nRec;

pParam=pCommand->CreateParameter("sID",adVarChar,adParamInput,255,vid);
pCommand->Parameters->Append(pParam);
pParam=pCommand->CreateParameter("nRec",adInteger,adParamOutput,sizeof(int),vk);
pCommand->Parameters->Append(pParam);

_variant_t vNull;
vNull.vt=VT_ERROR;
vNull.scode=DISP_E_PARAMNOTFOUND;

pRecordset=pCommand->Execute(&vNull,&vNull,adCmdStoredProc); // 问题出处★★★

_variant_t v;
v=pCommand->Parameters->GetItem(_variant_t("nRec"))->GetValue();
nRec=v.lVal ;


if(nRec>0)
{
// 取回返回值
pRecordset->MoveFirst();
_variant_t ss;
pRecordset->GetCollect("ID",ss);
}

-----------------------------------------------------------------------
我的问题:
如果我在“问题出处★★★”这行使用上面的代码就得不到v的值,总是显示VT_EMPTY,并且pRecordset->MoveFirst()也会报错;
但如果我将“问题出处★★★”这行代码换为如下:
pCommand->Execute(&vNull,&vNull,adCmdStoredProc);
也就是不把所检索的记录集赋值到pRecordset,v值就可以得到并且是正确的。

但是我是想既得到v值又想将检索的记录集赋值到pRecordset方便我逐条记录得查询啊,不知道是怎么回事,希望大家帮忙。


...全文
208 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
beidouqixingv 2011-03-27
  • 打赏
  • 举报
回复
UpdateData(true);
m_ctlList.ResetContent();
//通过ADO的COMMAND对象调用,执行存储过程
_CommandPtr pCommand;
pCommand.CreateInstance(__uuidof(Command));
_bstr_t storeproc("stuinfo");
_RecordsetPtr pRecordset;
try
{
pCommand->ActiveConnection=m_pConnection; //连接
pCommand->CommandText=storeproc;
pCommand->CommandType=adCmdStoredProc;
pCommand->Parameters->Refresh();
pCommand->Parameters->Item[_variant_t((long)1)]->Value=_variant_t((LPCTSTR)m_startname);
pRecordset.CreateInstance(__uuidof(Recordset));
pRecordset=pCommand->Execute(NULL,NULL,adCmdStoredProc);

if((pRecordset->adoBOF)&&(pRecordset->adoEOF))
{
AfxMessageBox("得到的记录集为空!");
pRecordset->Close();
return;
}
while(VARIANT_FALSE==pRecordset->adoEOF) //将得到的记录集添加到列表框
{
_variant_t vFieldValue;
CString strID,strName;
vFieldValue=pRecordset->GetCollect("Stop_id");
strID=(char*)_bstr_t(vFieldValue);
vFieldValue.Clear();
vFieldValue=pRecordset->GetCollect("Route_id");
strName=(char*)_bstr_t(vFieldValue);
vFieldValue.Clear();
CString strItem;
strItem.Format("起点站:%s 终点站:%s",strID,strName);
m_ctlList.AddString(strItem);
pRecordset->MoveNext();
}
}
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.ErrorMessage());
return;
}

存储过程如下:
CREATE procedure stuinfo
@unit char(10) ='%'
as
select sr.Stop_id,sr.Route_id
from Stop_Route sr,Stop s
where s.Stop_name = @unit
and sr.Stop_id=s.Stop_id
GO

这里只带一个参数,运行正确
另一个存储过程如下:
CREATE proc InquiryT0(@StartStops varchar(32),@EndStops varchar(32))
as
begin
declare @ss_tab table(Stop_id int)
declare @es_tab table(Stop_id int)
insert @ss_tab
select distinct Stop.Stop_id
from dbo.SplitString(@StartStops,'/') sn,Stop
where sn.Value=Stop.Stop_name
insert @es_tab
select distinct Stop.Stop_id
from dbo.SplitString(@EndStops,'/') sn,Stop
where sn.Value=Stop.Stop_name
if(exists(select top 1 * from @ss_tab sst,@es_tab est where sst.Stop_id=est.Stop_id))
begin
raiserror ('起点集和终点集中含有相同的站点',16,1)
return
end
select
ss.Stop_name as startname,
es.Stop_name as endname,
rr.Route_name as 乘坐线路,
r.StopCount as 总站点数
from
Stop ss,
Stop es,
Route rr,
@ss_tab sst,
@es_tab est,
RouteT0 r
where
sst.Stop_id=ss.Stop_id
and est.Stop_id=es.Stop_id
and r.Route_id=rr.Route_id
and sst.Stop_id=r.StartStop_id
and r.EndStop_id=est.Stop_id

end
GO


这里带有两个参数,应该如何修改呢?需要显示到列表框中来哦
邮箱:arise2007@126.com
希望有这方面的例子代码的同志支持一下啊,正在学习中!



步履人生 2008-01-03
  • 打赏
  • 举报
回复
谢谢大家!
更感谢handsomerun,示例不错!
不好意思,这个帖子太长时间了,SQL只是自己工作之余学的,呵呵,谢谢大家了!
handsomerun 2008-01-02
  • 打赏
  • 举报
回复
突然注意了一下,这个帖子竟然是9月份的………………

还没解决??????
handsomerun 2008-01-02
  • 打赏
  • 举报
回复
http://blog.csdn.net/handsomerun/archive/2007/07/28/1714598.aspx

看一下我的博客

注意几个问题

1是参数的顺序

2是pConn->CursorLocation =adUseClient;

可以先返回值,再output参数,最后记录集的
shakaqrj 2007-12-29
  • 打赏
  • 举报
回复

因为command得到的记录集是向前只读,不能movefirst

另外,如果存储过程是非查询语句,返回的是关闭的记录集,至于如果是混合的sql,我就不知道了

对于第一点,我怀疑
如果 CommandText 属性指定以行返回的查询,执行产生的任何结果都将存储在新的 Recordset 对象中
因此如果没有记录集接受,output参数生效
步履人生 2007-12-29
  • 打赏
  • 举报
回复
ding
zzh2106 2007-09-29
  • 打赏
  • 举报
回复
眼看花了,帮你顶下!
yuming7498 2007-09-26
  • 打赏
  • 举报
回复
pRecordset是读取一条记录,现在读出来的是记录集,当然不行了
某鸟 2007-09-26
  • 打赏
  • 举报
回复
你这种用法似乎是叫多结果集,具体使用请查阅 如何接受多结果集……

我见过,可我忘了……:(
步履人生 2007-09-23
  • 打赏
  • 举报
回复
关闭记录集?那我怎遍历我的记录集呢?
taia 2007-09-21
  • 打赏
  • 举报
回复
记录集要关闭后才能读到返回值
步履人生 2007-09-20
  • 打赏
  • 举报
回复
自己顶一下
大家帮忙看看,谢了

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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