yzxcsw, fausten 大侠 帮忙看一下 有关存储过程 及调用的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 VGA
  • 开始时间 开始时间
V

VGA

Unregistered / Unconfirmed
GUEST, unregistred user!
CREATE PROCEDURE GetNextPicID(
@TableName varchar(15),
@PackAgeNO varchar(4),
@TyperID varchar(4),
@TypeOrder varchar(2),
@PicID int output ) with recompile

AS

declare @STRSQL varchar(2000)

set @STRSQL = ' declare tmpcur cursor for select ' +
' max(文件序号) PicID from ' + @TableName + ' where [一打员]=' + @TyperID +
' and 包号=' + @PackAgeNO + ' and 文件序号 <' + convert( varchar(8), @PicID )
-- print @STRSQL

exec (@STRSQL)
open tmpcur
fetch next from tmpcur into @PicID
close tmpcur
deallocate tmpcur

if @PicID is null set @PicID=0


/*
在查询分析器中执行 是没有问题的
declare @pic_id int
set @pic_id = 4
exec getnextpicid 'pic_1', '1','10','1', @pic_id output
print @pic_id
*/
GO

上面是我的存储过程 在查询分析器里 调用是没有问题的 , 但在DELPHI中调用,提示游标不存在


我是这样写的代码用 SQLQuery (dbexpress)
procedure TForm1.Button3Click(Sender: TObject);
begin
with SQLQuery1 do
begin
Params.Clear;
Params.CreateParam(ftString, '@tablename', ptInput);
Params.CreateParam(ftString, '@PackAgeNO', ptInput);
Params.CreateParam(ftString, '@TyperID', ptInput);
Params.CreateParam(ftString, '@TypeOrder', ptInput);
Params.CreateParam(ftInteger, '@Pic_ID', ptOutput);

Params.ParamByName('@tablename').AsString := 'pic_1';
Params.ParamByName('@TyperID').AsString := '1';
Params.ParamByName('@PackAgeNO').AsString := '1';
Params.ParamByName('@TypeOrder').AsString := '1';
Params.ParamByName('@Pic_ID').AsString := '4';

sql.Text:=
'Exec GetNextPicID :@tablename, :@PackAgeNO, :@TyperID, :@TypeOrder, :@pic_id output';
SQLQuery1.ExecSQL();
caption:=IntToStr(Params.Parambyname('@pic_id').Value);
end;
end;

// 使用 TSQLStoredProc (Dbexpress)
procedure TForm1.Button2Click(Sender: TObject);
begin
with SQLStoredProc1 do
begin
Params.Clear;
StoredProcName := 'GetNextPicID';
SchemaName:='dbo';

Params.CreateParam(ftInteger, 'RETURN_VALUE', ptOutput);
Params.CreateParam(ftString, '@tablename', ptInput);
Params.CreateParam(ftString, '@PackAgeNO', ptInput);
Params.CreateParam(ftString, '@TyperID', ptInput);
Params.CreateParam(ftString, '@TypeOrder', ptInput);
Params.CreateParam(ftInteger, '@PicID', ptOutput);

Params.ParamByName('@tablename').AsString := 'pic_1';
Params.ParamByName('@TyperID').AsString := '1';
Params.ParamByName('@PackAgeNO').AsString := '1';
Params.ParamByName('@TypeOrder').AsString := '1';
Params.ParamByName('@PicID').AsString := '4';

ExecProc;
caption := Params.ParamByName('@PicID').AsString;
end;
end;

这两种方法都无法工作!
显示“SQL. State:3400, Sql Error Code16916”
不知错在哪里,怎样写才对?
 
CREATE PROCEDURE GetNextPicID(
@TableName varchar(15),
@PackAgeNO varchar(4),
@TyperID varchar(4),
@TypeOrder varchar(2),
@PicID int output ) with recompile

AS

declare @STRSQL varchar(2000)

set @STRSQL = ' declare tmpcur cursor for select ' +
' max(文件序号) PicID from ' + @TableName + ' where [一打员]=' + @TyperID +
' and 包号=' + @PackAgeNO + ' and 文件序号 <' + convert( varchar(8), @PicID )
-- print @STRSQL

exec (@STRSQL)
open tmpcur
fetch next from tmpcur into @PicID
close tmpcur
deallocate tmpcur

if @PicID is null set @PicID=0


/*
在查询分析器中执行 是没有问题的
declare @pic_id int
set @pic_id = 4
exec getnextpicid 'pic_1', '1','10','1', @pic_id output
print @pic_id
*/
GO

上面是我的存储过程 在查询分析器里 调用是没有问题的 , 但在DELPHI中调用,提示游标不存在


我是这样写的代码用 SQLQuery (dbexpress)
procedure TForm1.Button3Click(Sender: TObject);
begin
with SQLQuery1 do
begin
Params.Clear;
Params.CreateParam(ftString, '@tablename', ptInput);
Params.CreateParam(ftString, '@PackAgeNO', ptInput);
Params.CreateParam(ftString, '@TyperID', ptInput);
Params.CreateParam(ftString, '@TypeOrder', ptInput);
Params.CreateParam(ftInteger, '@Pic_ID', ptOutput);

Params.ParamByName('@tablename').AsString := 'pic_1';
Params.ParamByName('@TyperID').AsString := '1';
Params.ParamByName('@PackAgeNO').AsString := '1';
Params.ParamByName('@TypeOrder').AsString := '1';
Params.ParamByName('@Pic_ID').AsString := '4';

sql.Text:=
'Exec GetNextPicID :@tablename, :@PackAgeNO, :@TyperID, :@TypeOrder, :@pic_id output';
SQLQuery1.ExecSQL();
caption:=IntToStr(Params.Parambyname('@pic_id').Value);
end;
end;

// 使用 TSQLStoredProc (Dbexpress)
procedure TForm1.Button2Click(Sender: TObject);
begin
with SQLStoredProc1 do
begin
Params.Clear;
StoredProcName := 'GetNextPicID';
SchemaName:='dbo';

Params.CreateParam(ftInteger, 'RETURN_VALUE', ptOutput);
Params.CreateParam(ftString, '@tablename', ptInput);
Params.CreateParam(ftString, '@PackAgeNO', ptInput);
Params.CreateParam(ftString, '@TyperID', ptInput);
Params.CreateParam(ftString, '@TypeOrder', ptInput);
Params.CreateParam(ftInteger, '@PicID', ptOutput);

Params.ParamByName('@tablename').AsString := 'pic_1';
Params.ParamByName('@TyperID').AsString := '1';
Params.ParamByName('@PackAgeNO').AsString := '1';
Params.ParamByName('@TypeOrder').AsString := '1';
Params.ParamByName('@PicID').AsString := '4';

ExecProc;
caption := Params.ParamByName('@PicID').AsString;
end;
end;

这两种方法都无法工作!
显示“SQL. State:3400, Sql Error Code16916”
不知错在哪里,怎样写才对?
 
把 SQLQuery1.ExecSQL();
改为:SQLQuery1.Open; 试试
 
hxb---: SQLQuery1.Open 和 ExecSQL() 对我的程序没有区别
 
直接附值试试
with ADOQuery1 do
begin
close;
sql.Clear;
sql.Add('exec CCCrossTable @vSourceTAB=''设备数量统计'',@vGroupbyField=''所在地市'',@vTransFormCol=''设备名称'',@vPivotCol=''设备类别''');
open;
end;
 
liubin44966:
多谢参与!
用ADO控件的方法 yzxcsw 大侠 已经给出解决办法了(都好用),关键是现在用的是 dbexpress 控件呀,真是头疼....
对于其他的存储过程的调用 dbexpress 也是没有问题的, 就是 这一个总出错.
 
Params.ParamByName('@tablename'.Value:= 'pic_1';
 
把定义游标写到字符串外试试,你下面的写法是在字符串里。
declare @STRSQL varchar(2000)
set @STRSQL = ' declare tmpcur cursor for select ' +
' max(文件序号) PicID from ' + @TableName + ' where [一打员]=' + @TyperID + ' and 包号=' + @PackAgeNO + ' and 文件序号 <' + convert( varchar(8), @PicID )
-- print @STRSQL
exec (@STRSQL)
 
没用过dbexpress,关注中
 
多人接受答案了。
 
后退
顶部