起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 479|回复: 22

【搞定】存储过程错误

[复制链接]
发表于 2007-9-18 11:41:02 | 显示全部楼层 |阅读模式
procedure TLYP.BizFormCreate(Sender: TObject);
var
   vProc:TStoredProcDataSet;
   vUserId:string;
   vDepId:string;
   lDataParam1, lDataParam2: TDataParam;
begin
     vUserId := 'TEST';
     vDepId := 'KJJYC';
     vProc := TStoredProcDataSet.Create(self);
     try
        vProc.ConnectionString := 'DATABASEURL=Biz:JTTXMJTTSJK.DATABASE';
        vProc.StoredProcName := 'dbo.proc_TotalExport';
        vProc.Params.Clear();

        lDataParam1 := vProc.Params.CreateParam(TFieldType.ftString, '@DepId', TParamType.ptInput);
        lDataParam1.AsString :=vDepId;

        lDataParam2 := vProc.Params.CreateParam(TFieldType.ftString, '@UserId', TParamType.ptInput);
        lDataParam2.AsString :=vUserId;

        vProc.Open();

     finally
        lDataParam1.Free();
        lDataParam2.Free();
     end;

数据库脚本
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_TotalExport' AND type = 'P')
   DROP PROCEDURE proc_TotalExport
GO
Create Proc proc_TotalExport
(
@DepId VARCHAR(32),
@UserId VARCHAR(32)
)
AS
BEGIN

RETURN select * from kcb

END
GO

这个问题很急,请给与答复

未命名.gif

5.65 KB, 下载次数: 248

回复

使用道具 举报

发表于 2007-9-18 12:00:57 | 显示全部楼层
调试的时候,具体在那儿报错?
试试这样写
vProc.Params.ParamByName('@DepId').AsString := vDepId;
直接给参数赋值
回复 支持 反对

使用道具 举报

发表于 2007-9-18 12:03:51 | 显示全部楼层
楼主在窗体上放置TStoredProcDataSet控件。设置参数,运行。
不用动态创建的方法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 12:06:03 | 显示全部楼层

窗体上放置TStoredProcDataSet控件

放了报错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 12:09:02 | 显示全部楼层
想得到返回的结果集
select * from kcb 为固定表
不知道返回结果那个地方这么写对不!
        vProc.Params.CreateParam(TFieldType.ftDataSet,'@RETURN_VALUE',TParamType.ptResult);
去掉所有参数直接执行,也报错
回复 支持 反对

使用道具 举报

发表于 2007-9-18 12:53:59 | 显示全部楼层
procedure TLYP.BizFormCreate(Sender: TObject);
var
   vProc:TStoredProcDataSet;
   vUserId:string;
   vDepId:string;
begin
     vUserId := 'TEST';
     vDepId := 'KJJYC';
     vProc := TStoredProcDataSet.Create(nil);
     try
        vProc.ConnectionString := 'DATABASEURL=Biz:\JTTXM\JTTSJK.DATABASE';
        vProc.StoredProcName := 'dbo.proc_TotalExport';
        vProc.Params.ParamByName('@DepId').AsString := vDepId;
        vProc.Params.ParamByName('@DepId').AsString := vUserId;
        vProc.Active := True;
     finally

     end;
end;
试试上面的写法
调试一下,具体都报什么错?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 13:16:03 | 显示全部楼层
运行系统初始化的时候发生异常:
error occur during invoke getRecords method,setVariantParam
error :Invalid parameter index 0;
类型错误。

代码如下:
procedure TLYP.BizFormCreate(Sender: TObject);
var
   vProc:TStoredProcDataSet;
   vUserId:string;
   vDepId:string;
   lDataParam1, lDataParam2: TDataParam;
   lParam: TDataParam;
begin
     vUserId := 'TEST';
     vDepId := 'KJJYC';
     vProc := TStoredProcDataSet.Create(self);
     try
        vProc.ConnectionString := 'DATABASEURL=Biz:\JTTXM\JTTSJK.DATABASE';
        vProc.StoredProcName := 'proc_TotalExport';

        vProc.Params.CreateParam(TFieldType.ftString, '@DepId', TParamType.ptInput);
        vProc.Params.ParamByName('@DepId').AsString := vDepId;

        vProc.Params.CreateParam(TFieldType.ftString, '@UserId', TParamType.ptInput);
        vProc.Params.ParamByName('@UserId').AsString := vUserId;
        vProc.Active := True;
     finally
     
     end;
end;
回复 支持 反对

使用道具 举报

发表于 2007-9-18 13:53:54 | 显示全部楼层
vProc.Params.CreateParam(TFieldType.ftString, '@DepId', TParamType.ptInput);
vProc.Params.CreateParam(TFieldType.ftString, '@UserId', TParamType.ptInput);

去掉这两个!!再试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-18 13:55:24 | 显示全部楼层
运行系统初始化的时候发生异常:
error occur during invoke getRecords method,Parameter #4 has not been set
回复 支持 反对

使用道具 举报

发表于 2007-9-18 14:09:12 | 显示全部楼层
var
   vProc:TStoredProcDataSet;
   vUserId:string;
   vDepId:string;
   lDataParam1, lDataParam2: TDataParam;
begin
     vUserId := 'TEST';
     vDepId := 'KJJYC';
     vProc := TStoredProcDataSet.Create(self);
     try
        vProc.ConnectionString := 'DATABASEURL=Biz:\SYSTEM\SYSTEM.DATABASE';
        vProc.StoredProcName := 'proc_TotalExport';
        //vProc.Params.Clear();

        {lDataParam1 := vProc.Params.CreateParam(TFieldType.ftString, '@DepId', TParamType.ptInput);
        lDataParam1.AsString :=vDepId;

        lDataParam2 := vProc.Params.CreateParam(TFieldType.ftString, '@UserId', TParamType.ptInput);
        lDataParam2.AsString :=vUserId;}
        vProc.Params.ParamByName('@DepId').AsString := vDepId;
        vProc.Params.ParamByName('@UserId').AsString := vUserId;

        vProc.Active := True;

     finally
        lDataParam1.Free();
        lDataParam2.Free();
     end;
----------------------------------------------------
修改你的存储过程
CREATE Proc proc_TotalExport
(
@DepId VARCHAR(32),
@UserId VARCHAR(32)
)
AS
BEGIN

select * from A

END
GO
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-16 13:01 , Processed in 0.044361 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表