小弟做个产品类别下载的功能,根据本地选中的类别名称去orcale上取回数据,同时取回类别属性(类别名称和类别属性是2张表)
但是类别非常多,每次下载系统都会变得非常慢(已经用了多线程了),不知道有什么办法可以解决?

解决方案 »

  1.   

    也就是在oracle数据库里获得数据保存到本地?你得数据量有多大?数据的逻辑处理在服务其上执行的还是在本地执行的?
      

  2.   

    我原来的做法是这样的:
    先查找本地数据,如果已经下载,则删除掉再下载(服务器经常更新类别)
    接着 循环数据集 一条 一条的往数据集插入sql语句 
    这样的效率非常低下
      

  3.   

    我把代码贴出来 有点长 麻烦大家帮忙看下 谢谢了
    procedure chanpinxiazai.exteriorwork;
    var
      i:Integer;
      currNode: TTreeNode;
      strsql : string;
      amyQuery:tmyquery;
      Item: TTVItem;
    begin
      //产品类别树
      for i:=0 to Fmcplbxz.tv1.Items.Count-1 do
      begin
        currNode := Fmcplbxz.tv1.Items.Item[i];
        item.mask := TVIF_HANDLE;
        item.hItem := currNode.ItemId;
        TreeView_GetItem(Fmcplbxz.tv1.Handle, item);
        item.mask := TVIF_HANDLE or TVIF_STATE;
        if item.state = (item.state or $2000) and (not $1000) then
        begin
        //0 是根节点
          //先查找本地数据
          qry.Close;
          qry.SQL.Clear;
          qry.SQL.Add('select * from T_PROTYPE where t_proclassid = '
                      + QuotedStr(PNodeData(Fmcplbxz.tv1.Items.Item[i].Data)^.Index));
          qry.Open;
          if not qry.IsEmpty then
          begin
            //类别属性要先删除
            amyQuery:=tmyquery.create(nil );
            with amyQuery do
              try
                connection:=qry.Connection;
                sql.Clear;
                sql.Add('select T_TYPEID from T_ATTRIBUTE where T_PROCLASSID = '
                        + QuotedStr(PNodeData(Fmcplbxz.tv1.Items.Item[i].Data)^.Index));
                open;
                while not eof do
                begin
                  ExecuteSQL(dm.Con,'delete from T_ATTRIBUTE where T_TYPEID = '
                             + QuotedStr(fieldbyname('T_TYPEID').AsString));
                  next;
                end;
              finally
                free;
              end;
            ExecuteSQL(dm.Con,'delete from T_PROTYPE where t_proclassid = '
                       + QuotedStr(PNodeData(Fmcplbxz.tv1.Items.Item[i].Data)^.Index));
          end;
          //开始插入数据
          //dm.AstaClientSocket1.Active := false;
          dm.AstaClientSocket1.Active := True;
          if dm.AstaClientSocket1.Active = false then
          begin
            showmessage('gan');
            exit;
          end;
          application.ProcessMessages;
          AstaClientDataSet2.Close;
          AstaClientDataSet2.SQL.Clear;
          AstaClientDataSet2.SQL.Add('select * from T_PROTYPE where proclassid = '
                                      + QuotedStr(PNodeData(Fmcplbxz.tv1.Items.Item[i].Data)^.Index));
          AstaClientDataSet2.Open;
          sleep(1000);//停1秒
          strsql := 'INSERT INTO T_PROTYPE (t_proclassid,t_cmpid,t_proclassname,'
                     + 'T_PROFCLASSID,T_PROISLAST,T_PROINDEX,T_PROISPUBLIC,T_PROSHOWTYPE'
                     + ') VALUES ('
                     + QuotedStr(AstaClientDataSet2.fieldbyname('proclassid').AsString) + ','
                     + QuotedStr(AstaClientDataSet2.fieldbyname('companyID').AsString) + ','
                     + QuotedStr(AstaClientDataSet2.fieldbyname('proclassname').AsString) + ','
                     + QuotedStr(AstaClientDataSet2.fieldbyname('PROFCLASSID').AsString) + ','
                     + QuotedStr(AstaClientDataSet2.fieldbyname('PROISLAST').AsString) + ','
                     + QuotedStr(AstaClientDataSet2.fieldbyname('PROINDEX').AsString) + ','
                     + QuotedStr(AstaClientDataSet2.fieldbyname('PROISPUBLIC').AsString) + ','
                     + QuotedStr(AstaClientDataSet2.fieldbyname('PROSHOWTYPE').AsString)
                     + ')';
          ExecuteSQL(dm.Con,strsql);
          //类别属性也要下载下来
          AstaClientDataSet3.Close;
          AstaClientDataSet3.SQL.Clear;
          AstaClientDataSet3.SQL.Add('select * from t_attribute where proclassid = '
                                      + QuotedStr(PNodeData(Fmcplbxz.tv1.Items.Item[i].Data)^.Index));
          AstaClientDataSet3.Open;
          while not AstaClientDataSet3.eof do
          begin
            strsql := '';
            strsql := 'INSERT INTO t_attribute (T_TYPEID,T_PROCLASSID,T_PARENTID,'
                       + 'T_ATTNAME,T_ATTORDER,T_ATTSTYLE,T_ATTSIGN,t_ATTINDEX'
                       + ') VALUES ('
                       + QuotedStr(AstaClientDataSet3.fieldbyname('TYPEID').AsString) + ','
                       + QuotedStr(AstaClientDataSet3.fieldbyname('PROCLASSID').AsString) + ','
                       + QuotedStr(AstaClientDataSet3.fieldbyname('typefclassid').AsString) + ','
                       + QuotedStr(AstaClientDataSet3.fieldbyname('ATTNAME').AsString) + ','
                       + QuotedStr(AstaClientDataSet3.fieldbyname('ATTORDER').AsString) + ','
                       + QuotedStr(AstaClientDataSet3.fieldbyname('ATTSTYLE').AsString) + ','
                       + QuotedStr(AstaClientDataSet3.fieldbyname('ATTSIGN').AsString)+ ','
                       + QuotedStr(AstaClientDataSet3.fieldbyname('ATTINDEX').AsString)
                       + ')';
            ExecuteSQL(dm.Con,strsql);
            AstaClientDataSet3.next;
          end;
        end;
      end;
      FmProType1.ds1.DataSet.Refresh;
      FmProType1.ds2.DataSet.Refresh;
      FmProType1.FormInit;
      showmessage('下载成功!');
      Fmcplbxz.close;
    end;
      

  4.   

    关注,刚接触Oracle,不过估计Ms Sql也存在类似的情况。
      

  5.   

    本地是用mysql 服务器是用orcale 
      

  6.   

    可能是我代码写得思路太乱了吧
    不知道有没有办法通过xml来加载树?