如何解决SQL SERVER7.0 的存储过程 与DELPHI 中用StoreProc 控件执行存储过程的出现错误的问题。急,急,急! (100分)

K

khbmj

Unregistered / Unconfirmed
GUEST, unregistred user!
1。当我用SQL SERVER7.0 执行一个存储过程时无任何错误,但我用StoreProc
控件执行该存储过程时就会出现以下错误:
Procedure D:/JKXT/SQL/RJQS/GT/2/Ps_chgrqc.sql错误
General SQL error.
Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent
query。

该存储过程写法如下:
if exists (select * from sysobjects where id = object_id('YXKJ.Ps_chgrqc') and sysstat & 0xf = 4)
drop procedure YXKJ.Ps_chgrqc
GO
CREATE proc YXKJ.Ps_chgrqc -----------------回购(融券)撤单清算成交
--入口参数:
@pii_JLS INT, --记录数
@pis_CLSJBM VARCHAR(20), --处理数据表名
@pis_CLRQ CHAR(8), --处理日期
@pis_HYDM CHAR(4), --会员代码
@pis_FSRQ CHAR(8), --发生日期
@pis_FSSJ CHAR(12), --发生时间
@pis_HTXH CHAR(6), --合同序号
@pis_JYSDM CHAR(2), --交易所代码
@pis_GDDM VARCHAR(10), --股东代码
@pis_ZSGDDM VARCHAR(10), --真实股东代码
@pis_ZQDM VARCHAR(6), --证券代码
@pii_ZQLBDM INT, --证券类别代码
@pis_MMLXDM CHAR(2), --买卖类型代码
@pii_CJSL INT, --成交数量
@pif_CJJG DECIMAL(10,3), --成交价格
@pis_XWDM CHAR(6), --席位代码
@pis_CJHM CHAR(8), --成交号码
@pis_CLBZ CHAR(2), --处理标志
@pii_SSRJ INT, --实时清算和日结清算标志,0:实时清算,1:日结清算
@pis_LJFB CHAR(2) --累积分笔
--出口参数:result
--0:成功;-1:失败
--处理过程:
AS
DECLARE @li_FSSL INT --发生数量
DECLARE @li_JG INT --结果
DECLARE @ls_JLS CHAR(10) --使用动态SQL时转换INT 为CHAR用
DECLARE @lf_FSJE DECIMAL(16,2) --发生金额
DECLARE @lf_JE DECIMAL(16,2) --金额
DECLARE @ls_MMLXDM1 CHAR(2) --买卖类型代码1
DECLARE @lsGDDM CHAR(10)
DECLARE @lsZQDM CHAR(6)
DECLARE @lsMMLXDM CHAR(2)
DECLARE @ls_HBDM CHAR(2) --货币代码
DECLARE @ls_ZJZH CHAR(8) --资金帐号

--开始处理
IF @pis_MMLXDM='0'
SELECT @ls_MMLXDM1='1'
ELSE
SELECT @ls_MMLXDM1='0'

--检查成交是否WTCJQSB中
EXEC @li_JG=Ps_pccjpd
@pii_JLS,
@pis_HTXH,
@pis_GDDM,
@pis_ZQDM,
@pii_ZQLBDM,
@pis_JYSDM,
@ls_MMLXDM1,
@pis_CLBZ,
@pis_CLSJBM,
@pii_CJSL,
@lsGDDM OUTPUT,
@lsZQDM OUTPUT,
@lsMMLXDM OUTPUT
IF @li_JG<>0 --如果不存在(返回=-1)
return(-1)

SELECT @ls_HBDM=HBDM,@ls_ZJZH=ZJZH FROM WTCJQSB
WHERE JYSDM=@pis_JYSDM AND WTXH=@pis_HTXH AND ZQDM=@lsZQDM AND
GDDM=@lsGDDM AND MMLXDM=@lsMMLXDM

--撤单只存在于YXSJLB中
SELECT @li_FSSL=ABS(@pii_CJSL) --@pii_CJSL取绝对值
SELECT @lf_JE=@li_FSSL*100 --得到金额
SELECT @lf_FSJE=@lf_JE --发生金额

begin tran
--修改ZJHB中DJJE
UPDATE ZJHB SET DJJE=DJJE-@lf_FSJE
WHERE ZJZH=@ls_ZJZH AND HBDM=@ls_HBDM
--修改WTCJQSB中CXSL
UPDATE WTCJQSB SET CXSL=CXSL+@li_FSSL
WHERE JYSDM=@pis_JYSDM AND WTXH=@pis_HTXH AND GDDM=@lsGDDM AND
ZQDM=@lsZQDM AND MMLXDM=@lsMMLXDM
--从SSQSCWB中该条记录的错误信息
DELETE FROM SSQSCWB WHERE CZBM=@pis_CLSJBM AND JLS=@pii_JLS

-- 修改@pis_CLSJBM的CLBZ
SELECT @ls_JLS=Convert(char(10),@pii_JLS)
--置该条记录的CLBZ:=“T”,已处理过
EXEC('UPDATE '+@pis_CLSJBM +' SET CLBZ="T" WHERE JLS='+@ls_JLS)

--总部:
--修改ZJYEB中DJJE=DJJE-FSJE
UPDATE ZBJK_ZBGL.ZBGLXT.YXKJ.ZJYEB SET DJJE=DJJE-@lf_FSJE
WHERE RQ=@pis_CLRQ AND HYDM=@pis_HYDM AND HBDM=@ls_HBDM
--修改DRJYZJBGB中CXSL=CXSL+FSSL
UPDATE ZBJK_ZBGL.ZBGLXT.YXKJ.DRJYZJBGB SET CXSL=CXSL+@li_FSSL
WHERE HYDM=@pis_HYDM AND JYSDM=@pis_JYSDM AND
HBDM=@ls_HBDM AND ZQDM=@pis_ZQDM AND MMLXDM=@ls_MMLXDM1
commit tran
return(0)
//
谢谢
E-MAIL:khbmj@21cn.com
 
如果sql server上运行正确无误的话, 用Delphi中的query就能调用 :)
如果有返回值的话用Query.Open执行, 否则用Query.ExecSQL. 记住一 点, query里的
SQL语句除了应传递的参数外, 另需要多传一个参数作为返回值. 返回结果在
Query.Fields[0]里(如果是单个返回值的话)

你的例子:
query.sql.text := 'exec yxkj 参数1,参数2,参数3,.....,返回值';
query.open;
if query.fields[0].asInteger > 0 then
.....
 
接受答案了.
 
顶部