各位大俠我在DELPHI6下用ADOstoredproc CALL SQL SERVER的存儲過程,在call 第一次時是沒有問題在用同一控件call 第二次,第三次時常會出現“Access violation at address XXXXX in module ‘msado15.dll’”錯誤!請各位幫忙,急急!!!!!

解决方案 »

  1.   

    存儲過程如下:CREATE PROCEDURE [dbo].[pk_getwh]
      @p_ret       int=null  out,
      @p_msg    varchar(4000) =null out
    AS
      declare @sp_name  varchar(30)
      set @sp_name = '(pk_getwh)'
      select * from wh_wh order by whid
      set @p_ret = 1
      set @p_msg = 'ok!'+@sp_name
      return
    GODelphi的代碼:
    procedure TWHMANAGE_FRM.FormCreate(Sender: TObject);
    begin
      inherited;
      BulidWh;
      TV_wh.FullExpand
    end;procedure TWHMANAGE_FRM.bulidWH;
    var
      I: integer;
      V_ret: integer;
      V_msg: string;
      node: TTreeNode;
    begin
      with Dm.ADOWH do
      begin
        Active := False;
        ProcedureName := 'PK_GETWH';
    //    V_Ret := 0;
    //    V_msg := '';
        Prepared := True;
        Parameters.Refresh;
    //    parameters.Paramvalues['@P_Ret'] := V_ret;
    //    Parameters.ParamValues['@P_Msg'] := V_msg;
        Active := True;
        if not IsEmpty then
        begin
          First;
          for I := 0 to RecordCount - 1 do
          begin
            PV_WhID := FieldByName('WHID').AsString;
            Node := TV_WH.Items.AddChild(nil, FieldByName('WHID').AsString + '_' + FieldByName('WHNM').AsString);
            Node.ImageIndex := 14;
            Node.SelectedIndex := 15;
            bulidZone(Node);
            Next;
          end;
        end;
      end;
    end;
    procedure TWHMANAGE_FRM.bulidzone(V_UpNode: TTreeNode);
    var
      I: integer;
      V_ret: integer;
      V_msg: string;
      Node: TTreeNode;
    begin
      with Dm.ADOZONE do
      begin
    //    Close;
        Active := False;
        ProcedureName := 'PK_GETZONE';
    //    Prepared := True;
        Parameters.Refresh;
        Parameters.ParamValues['@P_WHID'] := PV_WhID;
    //    Parameters.ParamValues['@P_OP'] := G_UserID;
    //    parameters.Paramvalues['@P_Ret'] := V_ret;
    //    Parameters.ParamValues['@P_Msg'] := V_msg;
    //    Open;
        Active := True;
        if not IsEmpty then
        begin
          First;
          for I := 0 to RecordCount - 1 do
          begin
            PV_WhZONEID := FieldByName('WHZONEID').AsString;
            Node := TV_WH.Items.AddChild(V_upNode, FieldByName('WhZONEID').AsString + '_' + FieldByName('WhZONENM').AsString);
            Node.ImageIndex := 16;
            Node.SelectedIndex := 17;
            bulidSeg(Node);
            Next;
          end;
        end;
      end;
    end;其他還有二次procedure與上兩個相同,
    Thanks