我的存储过程如下:
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

解决方案 »

  1.   

    1.我把存储过程名给带进去
    2.这个存储过程总共有两个参数,一个是输入的,一个是输出的,所以只要传一个参数值进去我把存储过程加上后还是一样的报同样的错
    AdoQuery.SQL.Add(' EXEC pro_getofferid :aa,:bb Output ') ;
      

  2.   

    还有,你的Output在调用的时候不用加了。
      

  3.   


    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.
    执行成功