为什麽找不到StoredProc?(100分)

  • 主题发起人 主题发起人 jwa
  • 开始时间 开始时间
J

jwa

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟刚接触到SQL server,编了个存储过程,很简单,如下:
create procedure GetMax @Max int OUTPUT AS
select @Max=max(number) //求number字段的最大值
from dbo.student
在Delphi中的调用如下:
StoredProc1.Prepare;
StoredProc1.ExecProc;
Edit1.Text:=IntToStr(StoredProc1.Params[0].AsInteger);
一运行便显示"not find "dbo.GetMax",不知是何原因?
在没有参数的情况下一却正常.望指教.
 
如果在procedure 和table一个database里,不要dbo
 
啊?没看清,你这里不需要参数吧
 
StoredProc控件个人觉得有点神经。不知你的是不是和我的一样。
经常神经西西的说这说那不行的。别理它。用TQUERY决对没事
 
Max 和 函数max同名,可能不好
 
告诉你一种方法:
你可以在QUERY的SQL.TEXT中写'exec getmax :aa ',其中'aa'为DELPHI的返回参数.
procedure ......
var
Imax:integer;
begin
with query do
begin
close;
sql.text:='exec getmax :aa';
execsql;
Imax:=query.parambyname('aa').asinteger;
close;
end;
end;
 
好象需要用StoredProc1.Open;因为你的存储过程是有返回值的
用StoredProc1.ExecProc;好象不行
 
to All:问题还是没有解决.
to ice.yang:按你给的方法运行程序会出现"field '@max'is of an unknown type"错误.
能否给出详细用TQuery调用StoredProc的列子.
 
你的所谓SQL SERVER版本是什么?还有DELPHI?
SQL SERVER 7.0不能和Delphi4兼容存储过程,因为M恨B这个老东西.
请查看一下sysobjects表。
 
sql server7和 bde的兼容性有问题,好象microsoft的近期产品都不大支持bde,
改用odbc就可以了
 
找到StoreProc的Params属性
将@Max的DataType设为想要的类型
ParamType设为ptOutput就可以了
 
@Max int OUTPUT
~~~~~~ 为输出参数

输出参数是会产生一些问题,
我曾经试了半天,
没找到解决方案。
 
我的SQL的SP没有输出的,给您个ORACLE的例子吧.


CREATE PROCEDURE SP_PTPERMIT(
COMPIDI IN TPRODUCTTRANSFER.COMPID%TYPE,
PTNOI IN TPRODUCTTRANSFER.PTNO%TYPE,
USER IN TPRODUCTTRANSFER.USERNAME%TYPE,
RET OUT CHAR
) IS
VSTOREOUTNO TPRODUCTTRANSFER.STOREOUTNO%TYPE;
VSTOREINNO TPRODUCTTRANSFER.STOREINNO%TYPE;
VPERMIT TPTRANSFERDETAILS.WPERMIT%TYPE;
VLOCK TPTRANSFERDETAILS.WPERMIT%TYPE;
cursor C_PTD IS
SELECT PRODUCTNO,ISNORMAL,WEIGHT,WPERMIT
FROM TPTRANSFERDETAILS
WHERE COMPID=COMPIDI AND PTNO=PTNOI AND WEIGHT>0;
BEGIN
RET:='Y';
SELECT STOREOUTNO,STOREINNO INTO VSTOREOUTNO,VSTOREINNO
FROM TPRODUCTTRANSFER
WHERE COMPID=COMPIDI AND PTNO=PTNOI;
IF VSTOREINNO<>' ' AND VSTOREINNO IS NOT NULL THEN
FOR R IN C_PTD LOOP
IF R.WEIGHT>R.WPERMIT THEN
RET:='N';
EXIT;
END IF;
END LOOP ;
ELSE
FOR R IN C_PTD LOOP
SELECT WPERMIT INTO VPERMIT
FROM TORDERDETAILS OD,TDELIVERIES D,TPRODUCTTRANSFER P
WHERE P.PTNO=PTNOI AND P.COMPID=COMPIDI
AND D.DELIVERYNO=P.DELIVERYNO AND D.COMPID=P.COMPID
AND OD.ORDERNO=D.ORDERNO AND OD.COMPID=D.COMPID
AND OD.PRODUCTNO=R.PRODUCTNO AND OD.ISNORMAL=R.ISNORMAL;
SELECT WLOCK INTO VLOCK
FROM VNOTICELOCK OD,TDELIVERIES D,TPRODUCTTRANSFER P
WHERE P.PTNO=PTNOI AND P.COMPID=COMPIDI
AND D.DELIVERYNO=P.DELIVERYNO AND D.COMPID=P.COMPID
AND OD.ORDERNO=D.ORDERNO AND OD.COMPID=D.COMPID
AND OD.PRODUCTNO=R.PRODUCTNO AND OD.ISNORMAL=R.ISNORMAL;
IF VLOCK IS NULL THEN
VLOCK:=0;
END IF;
IF R.WEIGHT>(VPERMIT-VLOCK) THEN
RET:='N';
EXIT;
END IF;
END LOOP ;
END IF;
IF RET='Y' THEN
UPDATE TPRODUCTTRANSFER
SET STATUS='F',USERNAME=USER
WHERE PTNO=PTNOI AND COMPID=COMPIDI ;
END IF;
COMMIT;

EXCEPTION
WHEN NO_DATA_FOUND THEN
ROLLBACK;
WHEN OTHERS THEN
ROLLBACK;

END SP_PTPERMIT;





cdswbook.close;
cdswbook.params.parambyname('compidi').value:=CDSpt['compid'];
cdswbook.params.parambyname('ptnoi').value:=CDSpt['ptno'];
cdswbook.Execute;
cdswbook.FetchParams;
//showmessage(cdswbook.params.parambyname('compidi').asstring+' '+cdswbook.params.parambyname('ptnoi').asstring+' '+cdswbook.params.parambyname('RET').asstring);
// showmessage(cdswbook.params.parambyname('RET').asstring+' A '+COPY(cdswbook.params.parambyname('RET').asstring,1,1)+' A ');
if COPY(cdswbook.params.parambyname('RET').asstring,1,1)='N' then
BEGIN
if MessageDlg('已订量不足,您确认要生效该单吗?',
mtConfirmation, [mbYes, mbNo], 0) = mrNo then
abort;
END;
 
>>你的所谓SQL SERVER版本是什么?还有DELPHI?
M$ SQL server 7.0 and Delphi 5.0

>>sql server7和 bde的兼容性有问题,好象microsoft的近期产品都不大支持bde
那我岂不是很冤。:(上次一家公司面试题目中就有用Delphi调用存储过程,我只是在
书上看到过调用,没实践过,所以搞了很久都没搞出来,结果可想而之了。

是不是Delphi和M$SQl真的没戏唱了,明天又要到一家公司面试,如果再出这道题目,
那……:(
望个位大虾帮帮忙,小弟先谢了。
 
OUTPUT 变 INPUT OUTPUT 看看
 
问题解决了,原来是将StoredProc控键的StoredProcName属性缺省值'dbo.xxx;1'改为
'xxx',然后自己将所定义的参数加进去就行了。
谢谢各位的参与,放分了!:)
 
Faint

我原想过是否问题在此,
但你说“在没有参数的情况下一却正常”,
所以......
 
后退
顶部