procedure TServer.SaveList(ValuesList: OleVariant; Flag: Integer);
var
  i,J:integer;
  FoldName :string;
  FldType, FldSize,FldCaption:string;
  SQLtemp,s:string;
  IniFile,IniField:Tinifile;begin
   FoldName:=ExtractFilePath(Application.Exename)+'\'+uppercase(ValuesList[0][1]);   for i:= VarArrayLowBound(ValuesList,1) to VarArrayHighBound(ValuesList, 1) do
    begin
        try
          IniFile:= Tinifile.Create(FoldName+'_Table.ini');
          IniFile.WriteString(ValuesList[i][0],'Caption',ValuesList[i][0]);
        finally
         inifile.Destroy;
        end;
         if Flag=1 then //----------Save to Field
          begin(  执行这段开始:非常慢;为什么?)
             with ADOTemp do
                  begin
                    if Active then Active := False;
                    SQL.Clear;
                    SQLtemp:='SELECT * FROM ' + Trim(ValuesList[i][0])+' where 1=2';
                    SQL.Add(SQLtemp);
                    Prepared;
                  end;
                  try
                      ADOTemp.Open;
                      ADOTemp.First;
                      for J := 0 to ADOTemp.Fields.Count -1 do
                      begin
                            FldCaption:=ADOTemp.Fields[J].FieldName;
                            FldSize   := IntToStr(ADOTemp.Fields[J].Size);
                            FldType   := FieldTypeString(ADOTemp.Fields[J].DataType);
                            //------------生成ini文件
                            try
                             IniField:= Tinifile.Create(FoldName+'_Field.ini');
                             s:=Trim(ValuesList[i][0])+'.'+FldCaption;
                             IniField.WriteString(s,'TableName',Trim(ValuesList[i][0]));
                             IniField.WriteString(s,'Caption',FldCaption);
                             IniField.WriteString(s,'DataSize',FldSize);
                             IniField.WriteString(s,'DataType',FldType);
                            finally
                             IniField.Destroy;
                            end;
                            //------------生成ini文件
                            ADOTemp.Next;
                      end;
                      ADOTemp.Close;
                      ADOConn.Close;
                  except
                      ADOTemp.close;
                      ADOConn.Close;
                  end;
          end;
    end;end;

解决方案 »

  1.   

    晕。感觉代码有点乱。。for J := 0 to ADOTemp.Fields.Count -1 do
                          begin
                                FldCaption:=ADOTemp.Fields[J].FieldName;
                                FldSize   := IntToStr(ADOTemp.Fields[J].Size);
                                FldType   := FieldTypeString(ADOTemp.Fields[J].DataType);
                                //------------生成ini文件
                                try
                                 IniField:= Tinifile.Create(FoldName+'_Field.ini'); 
    // 这里创建了N次。
                                 s:=Trim(ValuesList[i][0])+'.'+FldCaption;
                                 IniField.WriteString(s,'TableName',Trim(ValuesList[i][0]));
                                 IniField.WriteString(s,'Caption',FldCaption);
                                 IniField.WriteString(s,'DataSize',FldSize);
                                 IniField.WriteString(s,'DataType',FldType);
                                finally
                                 IniField.Destroy;
                                end;
                                //------------生成ini文件
                                ADOTemp.Next;
                          end;
    .....
      

  2.   

    // 这里创建了N次。
    即就是放到for的外面,也很慢!
    代码贴上后就变成这个样^_^,没想到
      

  3.   

    数据也不是很多,for也就是1-1000多吧!
      

  4.   

    TO: victor_yang(victoryang) 
    是不是用adocnn.gettables(记不清了)
    是要得到表结构,但我是得到用户选择后的表,然后取选择的表的结构。
    但ado对oracle的支持好像有错误!老兄你有什么高见???
      

  5.   

    已经找到原因:IniFile.WriteString在数据多的时候执行的就非常慢,改成append后就可以,速度成倍的提高!