在一个数据模块(dm)上有一个
ADOStoredProc: TADOStoredProc;我在程序中这样调用;
-------------------------------------
  try
  with dm.ADOStoredProc do
    begin
       .......
     end;
  finally
    dm.ADOStoredProc.Free;
  end
-------------------------------------
当第一次用dm.ADOStoredProc 时,执行成功
但第二次之后就不用再用dm.ADOStoredProc我觉得是因为用了dm.ADOStoredProc.Free;来释放dm.ADOStoredProc;
请问
1,dm.ADOStoredProc.Free;这样释放正确不?如果不正确,应该怎做?
2,在用dm.ADOStoredProc之前应该怎判断dm.ADOStoredProc是否被释放?类似这样的判断:
if FrmQueryBookFiles(窗体名) = nil then
    begin
      FrmQueryBookFiles := TFrmQueryBookFiles.Create(self);
      FrmQueryBookFiles.Show;
    end

解决方案 »

  1.   

    不需要Free!把Active改为False就好了。Free后你的ADOStoredProc实际上在这个工程中已经不存在了。自然第二次就出错了
      

  2.   

    是啊,都FREE了,没有东西可调用了...除非你再次用代码生成它
      

  3.   

    FREE是程序的需要.我的问题是:
    怎判断dm.ADOStoredProc是否被释放?
      

  4.   

    这样子啊,那就这样来:
    DM.ADOStoredProc.Free;
    if not Assigned(DM.ADOStoredProc) then ShowMessage('ADOStoredProc已经被释放');
      

  5.   

    Kevin_Lmx(繁华阅尽) :DM.ADOStoredProc这控件是从面板拖拉来的,
    如果用DM.ADOStoredProc.Free;释放了,
    但再次要用到DM.ADOStoredProc,怎再去创建呢?
      

  6.   

    重新创建?例子:
    ADOStoredProc1.Free;
    ADOStoredProc1 := TADOStoredProc.Create(self);  //创建
    if Assigned(ADOStoredProc1) then ShowMessage('ADOStoredProc已经被创建');但是几乎所有你更改过的属性你都要在程序中重新的去赋值。
    还有我就不明白,为什么非要释放呢?有这个必要吗?
      

  7.   

    因为在程序用了数据库的事务.有时发生异常,
    try
    except
    end
    来过滤异常
    如果不释放DM.ADOStoredProc
    再次使用DM.ADOStoredProc,可能导致程序.
    CPU使用达100% 所以我用就了
    try
    ......
    finally
    DM.ADOStoredProc.free;
    end
      

  8.   

    怪了,现在怎不会出现程序忙.明天回公司检查一下代码再说;
    -------------------------------------------------------
    drop table a
    gocreate table a (a varchar(10) primary key)
    godrop proc proca
    gocreate proc proca(@a varchar(10))
    as
    begin
     insert a
     select @a
    end
    go-----------------------------------------------------------
      try
      ADOConnection1.BeginTrans;
       with ADOStoredProc1 do
         begin
           close;
           parameters.Clear;
           procedurename:='proca;1';
           parameters.Refresh;
           parameters.ParamByName('@a').Value:=trim(edit1.Text);
           execproc;
         end;
         showmessage('ok!');
      ADOConnection1.CommitTrans;//在execpt之前;
      except
      showmessage('mistake!');
      ADOConnection1.RollbackTrans;
      end;
      

  9.   

    对于有OWner不需要手动释放,无属主就用FillAndNil(adoprocedure1);去释放
      

  10.   

    FillAndNil
    是什么啊?在帮助里找不到它
      

  11.   

    drop table a
    gocreate table a (a varchar(10) primary key)
    godrop proc proca
    gocreate proc proca(@a varchar(10))
    as
    begin
     insert a
     select @a
    end
    go
    -------------------------------
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Not Assigned(ADOStoredProc1) then
      begin
        ADOStoredProc1:=TADOStoredProc.Create(self);
        ADOStoredProc1.Connection := ADOConnection1;
      end;
      try
      ADOConnection1.BeginTrans;
       with ADOStoredProc1 do
         begin
           close;
           parameters.Clear;
           procedurename:='proca;1';
           parameters.Refresh;
           parameters.ParamByName('@a').Value:=trim(edit1.Text);
           execproc;
         end;
         showmessage('ok!');
      ADOConnection1.CommitTrans;
      except
      //finally
      showmessage('mistake!');
      ADOStoredProc1.free;
      ADOConnection1.RollbackTrans;
      end;
    end;
    -----------------------------------------------------
    重复几次就会出错;
      

  12.   

    因为在内存栈中还存在. adostoredproc1指针。所以最安全如果不指定OWNER,就得用
     FreeAndNil(adostoredproc1);
    如果指定了OWNER,可以在创建之前加一句:if adostoredproce1<>nil then 加以判断