请各位帮忙看看这代码有什么问题?为什么我反复调用的时候会出现“未指定的错误”?
adosql是公共函数调用,每查询的时候调用一次。请给改正意见或示例代码。谢谢!
function adosql(q:TADOQuery;sql:string):TADOQuery;   //查询公共函数
begin  connstr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=yyxy.mdb;Persist Security Info=False';
  q:=TADOQuery.Create(nil);
  q.ConnectionString:=connstr;
  q.Close;
  q.SQL.Clear;
  q.SQL.Add(sql);
  q.Open ;
  result:=q;
end;//调用过程
procedure Edit3ButtonClick(Sender: TObject);
  rd:=adosql(rd,'select * from table  ');
  while not rd.Eof do
    begin
      text.Items.Add(rd.FieldByName('text').AsString);
          rd.Next;
    end;
 end;

解决方案 »

  1.   

    procedure Edit3ButtonClick(Sender: TObject); 
    begin
      rd:=adosql(rd,'select * from table  '); 
      text.Items.Clear;
      rd.First;
      while not rd.Eof do 
      begin 
        text.Items.Add(rd.FieldByName('text').AsString); 
        rd.Next; 
      end; 
    end;
      

  2.   

    procedure Edit3ButtonClick(Sender: TObject); 
    begin  
      rd:=adosql(rd,'select * from table '); 
      text.Items.Clear;
      rd.First;
      while not rd.Eof do 
      begin 
        text.Items.Add(rd.FieldByName('text').AsString); 
        rd.Next; 
      end; 
    end;
      

  3.   

    grjs2004 
    的办法,解决不到问题..
      

  4.   

    内存泄露是肯定的。但这个30次就能引起错误吗?可能是30个DataSet对Access数据库访问到一些相同的表,出现了冲突什么的。
      

  5.   

    //function adosql(q:TADOQuery;sql:string):TADOQuery;  //查询公共函数 
    function adosql(q:TADOQuery;sql:string):Bool;  //改  q是外部引入的,所以没必要返回,因为本来就是别人的
    begin   connstr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=yyxy.mdb;Persist Security Info=False';  //1
    //  q:=TADOQuery.Create(nil);    //从外部引进,就不需要这里在创立了.
      q.ConnectionString:=connstr;  //2  //1和2在别的地方可以直接连的,你这里的功能只是执行,然后返回数据集.
      sql=sql.Trim;                 //去掉左右空格
      if (sql.SubString(1,1)<>'s' or sql.SubString(1,1)<>'S') return false;  //不是大小写S开头就返回,汗,涵数结构定义也变一下..不好意思.
      q.Close;                                          
      q.SQL.Clear; 
      q.SQL.Add(sql); 
      q.Open ; 
      return true; 
    end; //调用过程 
    procedure Edit3ButtonClick(Sender: TObject); 
       
      if(adosql(rd,'select * from table  ')=false) return;
      rd.First;                       //一般都是定位于第一行,但一般我都写的.呵呵
      while not rd.Eof do 
        begin 
          text.Items.Add(rd.FieldByName('text').AsString); 
              rd.Next; 
        end; 
    end;
      

  6.   

    代碼的缺點太多。 function adosql(q:TADOQuery;sql:string):TADOQuery;  //查询公共函数 
    begin   connstr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=yyxy.mdb;Persist Security Info=False'; 
      //  q:=TADOQuery.Create(nil);   從調用者傳過來如果是一個實例的引用,這裏就不需要創建。
      // q.ConnectionString:=connstr;    即然是公用函數,那麼數據庫連接也應該是在調用者身上,而不是在這裏賦值,這樣就不是公用了。 而且這裏的所有 Taoquery你都沒有用 TAdoConnection  去管理,每增加一次查詢,就建立一個 Connection ,  估計過不了幾次他就罷工了。
      q.Close; 
      q.SQL.Clear; 
      q.SQL.Add(sql); 
      q.Open ; 
      result:=q; 
    end; //调用过程 
    procedure Edit3ButtonClick(Sender: TObject); 
      rd:=adosql(rd,'select * from table  '); 
      while not rd.Eof do 
        begin 
          text.Items.Add(rd.FieldByName('text').AsString); 
              rd.Next; 
        end; 
    end;
      

  7.   


    procedure adosql(var q: TADOQuery;  sql: String);  //查询公共函数 
    begin 
      connstr := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=yyxy.mdb;Persist Security Info=False'; 
      q.ConnectionString := connstr; 
      q.Close; 
      q.SQL.Clear; 
      q.SQL.Add(sql); 
      q.Open; 
    end; //调用过程 
    procedure Edit3ButtonClick(Sender: TObject); 
    var
      rd : TADOQuery;
    begin
      rd := TADOQuery.Create(nil);
      try
        adosql(rd, 'select * from table'); 
        while not rd.Eof do 
        begin 
          text.Items.Add(rd.FieldByName('text').AsString); 
          rd.Next; 
        end; 
      finally
        rd.Free;
      end; 
    end;