郁闷啊!通过ADO调用SQL_server的存储过程,但出了一个莫名其妙的问题!!请解,解决就送分!

wh_cd 2003-10-15 01:28:15
我有一个存储过程如下:

CREATE PROCEDURE my_getcoluname

@Table Varchar(20),
@coluname Varchar(200)='' output

AS

select @coluname= @coluname+','+name from syscolumns where id=object_id(''+@Table+'')
set @coluname=substring( @coluname,2,200)

GO
------------------
我在BCB中代码如下:(TName是我的所需查看的表的表名,肯定在库中存在!)

ADOConnection1->Open();
ADOStoredProc1->Close();
ADOStoredProc1->Parameters->Clear();
ADOStoredProc1->ProcedureName = "my_getcoluname";
ADOStoredProc1->Parameters->CreateParameter("@table",ftString,pdInput,20,NULL);
ADOStoredProc1->Parameters->CreateParameter("@coluname",ftString,pdOutput,200,0);
ADOStoredProc1->Parameters->ParamByName("@table")->Value = TName;
ADOStoredProc1->ExecProc();
Field_Name = ADOStoredProc1->Parameters->ParamByName("@coluname")->Value;
ADOConnection1->Close();
---------------------
但结果老是 “ADOStoredProc1->Parameters->ParamByName("@coluname")->Value”的值为NULL,无法转换为String型。

但我在SQL查询分析器中执行,此存储过程又能够正常使用,返回所需的值!!

------------------------------
请高手指点一下,我的代码到底是那儿出了错啊???先谢过大家了!
...全文
76 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ton2000 2003-10-16
  • 打赏
  • 举报
回复
BTW,你CB代码中的@可以去掉,那只是一个名字,不一定要和存储过程中的参数名相同,我觉得在代码里@看起来怪怪的,呵!
Ton2000 2003-10-16
  • 打赏
  • 举报
回复
把你的存储过程改成下面的样子就行了:

CREATE PROCEDURE my_getcoluname

@Table Varchar(20),
@coluname Varchar(200)='' output

AS

IF @coluname is null set @coluname = '' --主要是增加这条语句

select @coluname= @coluname+','+name from syscolumns where id=object_id(''+@Table+'')
set @coluname=substring( @coluname,2,200)

GO
------------------
[说明]
如果你打开MS SQL的事件探查器,并在你的程序中执行查询过程,就会看见CB往MS SQL发了如下SQL语句:

declare @P1 varchar(200)
set @P1=null
exec my_getcolumname 'ACST', @P1 output
select @P1

看见没有@P1被被初始化为空,所以你在你的存储过程中应该要判断参数@coluname是否为空,如果为空,那么存储过程执行后@P1会依然为空,因为select @coluname= null+','...的结果绝对是null,所以在你的程序执行到下面的语句:
Field_Name = ADOStoredProc1->Parameters->ParamByName("@coluname")->Value;
的时候就会报错了,因为null转换成String时必然会发生异常的。

see? 如果不还不明白,可以给我留言:-)

Good luck
52vc 2003-10-16
  • 打赏
  • 举报
回复
设置一个返回值
return 0
wh_cd 2003-10-15
  • 打赏
  • 举报
回复
回复人: ljianq(泉深水清) ( ) 信誉:103 2003-10-15 17:13:00 得分:0


调用的时侯是不是多了个"@"?
--------------------------------------------------

请问你是指什么地方多了个 @ 啊?

ADOStoredProc1->Parameters->ParamByName("@table")->Value = TName;

这句中好象应该有那个@吧,我有一个类型的调用,没有问题,但这一次不知是那儿出了问题了!

指点一下吧!
ljianq 2003-10-15
  • 打赏
  • 举报
回复
调用的时侯是不是多了个"@"?
wh_cd 2003-10-15
  • 打赏
  • 举报
回复
自顶一下,请高手帮忙啊!
wh_cd 2003-10-15
  • 打赏
  • 举报
回复
哎!不行啊!急啊!在线等高手给解!
ljlln 2003-10-15
  • 打赏
  • 举报
回复
@coluname Varchar(200) output

ADOStoredProc1->Parameters->ParamByName("@table")->Value = TName;
ADOStoredProc1->Parameters->ParamByName("@coluname")->Value ="" ;

ADOStoredProc1->ExecProc();

Field_Name = ADOStoredProc1->Parameters->ParamByName("@coluname")->AsString ;

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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