我的存储过程如下:
CREATE PROCEDURE pro_getofferid
@ls_table_name varchar(30), @seqid int output
AS
BEGIN
if @ls_table_name='fz_sys_itemid'
begin
insert into fz_sys_itemid default values;
delete from fz_sys_itemid;
set @seqid=SCOPE_IDENTITY();
end
end
GO我在delphi中的调用该存储哦过程的源码如下: AdoQuery.SQL.Add(' EXEC :aa,:bb Output ') ;
AdoQuery.Parameters.Items[0].Value:='fz_sys_itemid';
AdoQuery.Prepared:=true;
AdoQuery.ExecSQL ;
showmessage(inttostr(AdoQuery.Parameters.Items[1].Value));每次一执行到showmessage这里就会报错提示:Invalid variant type conversion,调试过程中发现是AdoQuery.Parameters.Items[1].Value返回为NULL导致,这个是啥原因了,求解啊。我的存储过程执行可以得到结果:
declare @seqid varchar(30)
exec pro_getofferid 'fz_sys_itemid',@seqid output
print @seqid
存储过程执行结果如下:
(所影响的行数为 1 行)(所影响的行数为 1 行)
35
CREATE PROCEDURE pro_getofferid
@ls_table_name varchar(30), @seqid int output
AS
BEGIN
if @ls_table_name='fz_sys_itemid'
begin
insert into fz_sys_itemid default values;
delete from fz_sys_itemid;
set @seqid=SCOPE_IDENTITY();
end
end
GO我在delphi中的调用该存储哦过程的源码如下: AdoQuery.SQL.Add(' EXEC :aa,:bb Output ') ;
AdoQuery.Parameters.Items[0].Value:='fz_sys_itemid';
AdoQuery.Prepared:=true;
AdoQuery.ExecSQL ;
showmessage(inttostr(AdoQuery.Parameters.Items[1].Value));每次一执行到showmessage这里就会报错提示:Invalid variant type conversion,调试过程中发现是AdoQuery.Parameters.Items[1].Value返回为NULL导致,这个是啥原因了,求解啊。我的存储过程执行可以得到结果:
declare @seqid varchar(30)
exec pro_getofferid 'fz_sys_itemid',@seqid output
print @seqid
存储过程执行结果如下:
(所影响的行数为 1 行)(所影响的行数为 1 行)
35
2.这个存储过程总共有两个参数,一个是输入的,一个是输出的,所以只要传一个参数值进去我把存储过程加上后还是一样的报同样的错
AdoQuery.SQL.Add(' EXEC pro_getofferid :aa,:bb Output ') ;
CREATE TABLE fz_sys_itemid
(
seq INT IDENTITY(1, 1)
)
GO
ALTER PROCEDURE pro_getofferid
@ls_table_name VARCHAR(30) ,
@seqid INT OUTPUT
AS
BEGIN
IF @ls_table_name = 'fz_sys_itemid'
BEGIN
INSERT INTO fz_sys_itemid
DEFAULT VALUES ;
DELETE FROM fz_sys_itemid ;
SET @seqid = SCOPE_IDENTITY() ;
END
END
GO
DECLARE @cha VARCHAR(20)='fz_sys_itemid'
DECLARE @seqid INT
EXEC pro_getofferid @cha, @seqid OUTPUT
SELECT @seqid
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB;type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
try
if not ADOConnection1.Connected then
ADOConnection1.Open;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
AdoQuery1.SQL.Add(' EXEC pro_getofferid :aa,:bb Output ') ;
AdoQuery1.Parameters.Items[0].Value:='fz_sys_itemid';
AdoQuery1.Prepared:=true;
AdoQuery1.ExecSQL ;
showmessage(inttostr(AdoQuery1.Parameters.Items[1].Value));
except
on e:Exception do
ShowMessage(e.Message);
end;
end;end.
执行成功