救命呀!我想了两天了,还是不明白.熟悉存储过程的高手请进,急!急!救人一命胜.......

abcdsdadfasfasfasfsa 2001-09-14 12:34:44
sqlserver7.0 存储过程如下:传入ID,更新strName,@strRet返回执行结果
CREATE PROCEDURE[USP_REN_PRDT]
@ID int,
@strName varchar,
@strRet char(1) output
AS
update Product_Data
set ProductName=@strName
where ProductID =@ID
if @@error=0
begin
set @strRet='T'
end
else
begin
set @strRet='F'
end
我想在vc 中调用,但我不知道如何取得strRet的值,各位高手,拉小弟一把吧,我
快疯了,我应该如何调用上面的存储过程并取得过程的返回信息。
对于有很多个返回字段(output)的存储过程,如何用CRecordset类接收返回的结果集
,谢谢
...全文
238 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jasmine 2001-09-15
  • 打赏
  • 举报
回复
沒用過,ADO對象沒問題,這個年代了,我早就不用mfc和odbc了,不好意思,嘟嘟
  • 打赏
  • 举报
回复
不是,我用的是mfc odbc 的CDatabase类对象
jasmine 2001-09-15
  • 打赏
  • 举报
回复
你還是用ado對象的嗎
  • 打赏
  • 举报
回复
to jasmine(Yaya):
你的方法不行,语法错误,你能结合vc代码讲讲吗?
wugf 2001-09-14
  • 打赏
  • 举报
回复
vc 是这样玩的。 (没验证, 不懂再查帮助)

_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2(DISP_E_PARAMNOTFOUND, VT_ERROR);
_bstr_t bstrEmpty(L"");

exeSp()
{

// Create db connect
m_pDBConn.CreateInstance(__uuidof(ADODB::Connection));

m_pDBConn->ConnectionString = CONNECTSTRING;
m_pDBConn->Open("", "", "", NULL);

// create command
m_pCmd = NULL;
m_pCmd.CreateInstance(__uuidof(ADODB::Command));

m_pCmd->ActiveConnection = m_pDBConn;
m_pCmd->CommandText = _bstr_t( 'your sp name' );
m_pCmd->CommandType = ADODB::adCmdStoredProc;

// empty parameters
m_pCmd->Parameters->Refresh();

// set parameters
m_pCmd->Parameters->Item[ _variant_t( (long) 1 ) ]->Value = _variant_t( (double) yourID );
m_pCmd->Parameters->Item[ _variant_t( (long) 2 ) ]->Value = _variant_t( (char*) yourName );

// execute sp
m_pCmd->Execute( &vtEmpty, &vtEmpty2, ADODB::adCmdStoredProc );

// get out data
printf("out val: %f\n", (double)m_pCmd->Parameters->Item[ _variant_t( (long) 3 ) ]->Value );

// 释放。。。。

}

zhuzhichao 2001-09-14
  • 打赏
  • 举报
回复
我不知道在vc中怎麼實現.

我只知道在
Query Analyzer中是這麼實現的:
declare @strRet char(1)
exec USP_REN_PRDT 1,'jamesfork',@strRet output; --output是必須要寫的,否則得不到輸出值.
print @strRet;

你可以試試/
wugf 2001-09-14
  • 打赏
  • 举报
回复
你是用ADO进行DB操作的吗?
wugf 2001-09-14
  • 打赏
  • 举报
回复
把你现有的C程序给我看看, 才好说。
jasmine 2001-09-14
  • 打赏
  • 举报
回复
應該沒有問題的
  • 打赏
  • 举报
回复
to jasmine(Yaya) :
在存储过程中,你的方法也许是对的,不过,我是要在vc的代码中调用此存储过程,是不是在被调用的CDatabase 类的sql语句写成declare @result int
exec @result = test 2
select @result, 我试试先,
jasmine 2001-09-14
  • 打赏
  • 举报
回复
對於返回值你可以試一下
create proc test(@param int)
as
begin
if @param = 1
return 0
else
return 100
end

declare @result int
exec @result = test 2
select @result
看我給你返回個100
jasmine 2001-09-14
  • 打赏
  • 举报
回复
我已經說啊,你在給一個Connection 的execute 方法給參值時,sql語句寫成3句,以zhuzhichao給的為例 "declare @strRet char(1) exec USP_REN_PRDT 1,'jamesfork',@strRet output select @strRet"因為最後是一個結果集,是可以用cRecordset得到的.
  • 打赏
  • 举报
回复
to zhuzhichao(竹之草):
我原来也是用output的,但是我不知道用什么去接收output返回的值,是不是要用CRecordset类,如果你知道,请详细点告诉我,谢谢
to jasmine(Yaya) :
我不知道如何接收存储过程return 的值,程序执行时,如果过程执行成功,返回都是0,不成功的话,返回都是-1,即使我在存储过程中强制用"return 100"(成功),"return 101"
(失败) ,你能教教我吗,谢谢
jasmine 2001-09-14
  • 打赏
  • 举报
回复
最簡單的方法 你改一下sp,不用返回值 你這樣返回
if @@error=0
begin
set @strRet='T'
select @strRet
end
else
begin
set @strRet='F'
select @strRet
不過向你這樣的情況,也不應該這樣返回,sp是有返回值的
if @@error=0
begin
return 0
end
else
begin
return 1
end
調用的時候 "declare @result int exec @result = USP_REN_PRDT id .. select @result" 這樣cconection->execute 返回的是一個recordset
同理 你現在這樣寫也是可以返回的 向zhuzhichao(竹之草)說的一樣,不過最後改成select @strRet,也能返回一個recordset的.

34,870

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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