起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 448|回复: 12

【结】新增数据慢

[复制链接]
发表于 2010-1-8 16:20:09 | 显示全部楼层 |阅读模式
你好:
   我再新增数据时:数据非常的慢,用了DiableControls, 甚至用克隆是数据集把数据独立出来处理。可是还是很慢。新增750条数据要10秒。我用Locate判断数据是否存在。这样影响有那么大吗。
回复

使用道具 举报

发表于 2010-1-8 16:34:52 | 显示全部楼层
为什么呀locate呢?你把它先去掉,插入对比看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-8 16:36:50 | 显示全部楼层
如果新增数据已经在表中存在。就不能新增。所以要locate把它滤去。我用克隆数据集和标准数据集测试速度几乎一样。locate去掉就不符合要求了。不过我可以试一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-8 16:42:35 | 显示全部楼层
你好,去掉Locate后数据时快了一些。800条5秒左右。可是这样不符合要求。有没有其他的优化方法
回复 支持 反对

使用道具 举报

发表于 2010-1-8 17:10:27 | 显示全部楼层
要不搞存储过程吧,
回复 支持 反对

使用道具 举报

发表于 2010-1-8 17:11:19 | 显示全部楼层
使用tquery测试一下4楼的方法看看是多少?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-8 17:16:44 | 显示全部楼层
我新增的是个自定义数据集。用来返回新增的数据。供其他模块使用。不在数据表中保存的。
回复 支持 反对

使用道具 举报

发表于 2010-1-9 10:05:37 | 显示全部楼层
能把代码贴出来看看吗?在每条新增都要Locate 这样肯定会影响速度的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-9 13:51:29 | 显示全部楼层
你好。这次主要的代码部分

  try
    DataSetSelectNode.DisableControls;
    DsPersonRole.DisableControls;
    DataSetSelectNode.First;
    while not DataSetSelectNode.Eof do
      begin
       if DataSetSelectNode.FieldByName('XZ').AsInteger=1 then
          begin
            BookMark:=DataSetSelectNode.Bookmark;
            for i:=0 to  olvPerson.SelectedNodes.Count-1 do
              begin
                URL:=TBizNode(olvPerson.SelectedNodes.Objects[I]).BizURL.URL;   //类型转换取得人员成员的URL
                SYSTEMUTILS.TOrgUtils.GetOrgIDs(URL,iDept,iPosition,iPerson);  //用GetOrgIDs函数通过人员成员的URL获得人员的PersonID,DetpID, PositionID.
                lPerson:=org.OrgSys.OrgSystem.GetPerson(iPerson);

                if (RadioGroup.ItemIndex=0) or (RadioGroup.ItemIndex=4) then   //执行主体和执行协同不能是同一个人或者已经完成。
                  begin
                    lResult:=DsPersonRole.Locate('FSchemeID;FNodeID;FRole;FPersonID',
                     Variants.VarArrayOf([
                                         DataSetSelectNode.FieldByName('FSchemeID').AsString,
                                         DataSetSelectNode.FieldByName('FNodeID').AsString,
                                         RadioIndex(0),lPerson.ID]),[]) or
                             DsPersonRole.Locate('FSchemeID;FNodeID;FRole;FPersonID',
                     Variants.VarArrayOf([
                                         DataSetSelectNode.FieldByName('FSchemeID').AsString,
                                         DataSetSelectNode.FieldByName('FNodeID').AsString,
                                         RadioIndex(4),lPerson.ID]),[]) or
                                         (DataSetSelectNode.FieldByName('FExecutState').AsString='1');
                  end
                else if (RadioGroup.ItemIndex=1) then   //责任主体不能是同一个人或者已经完成。
                  begin
                    lResult:=DsPersonRole.Locate('FSchemeID;FNodeID;FRole;FPersonID',
                     Variants.VarArrayOf([
                                         DataSetSelectNode.FieldByName('FSchemeID').AsString,
                                         DataSetSelectNode.FieldByName('FNodeID').AsString,
                                         RoleType,lPerson.ID]),[]) or
                                         (DataSetSelectNode.FieldByName('FResponState').AsString='1');
                  end
                else if (RadioGroup.ItemIndex=2) then   //核算主体不能是同一个人或者已经完成。
                  begin
                    lResult:=DsPersonRole.Locate('FSchemeID;FNodeID;FRole;FPersonID',
                     Variants.VarArrayOf([
                                         DataSetSelectNode.FieldByName('FSchemeID').AsString,
                                         DataSetSelectNode.FieldByName('FNodeID').AsString,
                                         RoleType,lPerson.ID]),[]) or
                                         (DataSetSelectNode.FieldByName('FAccountState').AsString='1');
                  end
                else if (RadioGroup.ItemIndex=3) then   //控制主体不能是同一个人或者已经完成。
                  begin
                    lResult:=DsPersonRole.Locate('FSchemeID;FNodeID;FRole;FPersonID',
                     Variants.VarArrayOf([
                                         DataSetSelectNode.FieldByName('FSchemeID').AsString,
                                         DataSetSelectNode.FieldByName('FNodeID').AsString,
                                         RoleType,lPerson.ID]),[]) or
                                         (DataSetSelectNode.FieldByName('FControllState').AsString='1');
                  end;

              //如果为真则定位下一条。为假则添加进去。
              if lResult then
                begin

                end
              else
                begin
                  DsPersonRole.Append;
                  DsPersonRole.FieldByName('FProjectGUID').AsString:=DataSetSelectNode.FieldByName('FProjectGUID').AsString;  //项目ID
                  DsPersonRole.FieldByName('FProjectNodeGUID').AsString:=DataSetSelectNode.FieldByName('FID').AsString;       //项目节点ID
                  DsPersonRole.FieldByName('FProjectID').AsString:=DataSetSelectNode.FieldByName('FProjectID').AsString;      //项目分期ID
                  DsPersonRole.FieldByName('FSchemeID').AsString:=DataSetSelectNode.FieldByName('FSchemeID').AsString;        //分期ID
                  DsPersonRole.FieldByName('FNodeID').AsString:=DataSetSelectNode.FieldByName('FNodeID').AsString;            //节点ID
                  DsPersonRole.FieldByName('FRole').AsString:=RoleType;                  //取得人员角色
                  DsPersonRole.FieldByName('FPersonURL').AsString:=URL;                  //人员URL
                  DsPersonRole.FieldByName('FPersonID').AsString:=lPerson.ID;            //人员ID
                  DsPersonRole.FieldByName('FPerson').AsString:=lPerson.DisplayName;     //人员
                  lPostion:=org.OrgSys.OrgSystem.GetPosition(iPosition);
                  DsPersonRole.FieldByName('FPositionID').AsString:=lPostion.ID;         //岗位ID
                  DsPersonRole.FieldByName('FPosition').AsString:=lPostion.DisplayName;  //岗位
                  lDept:=Business.Model.Org.OrgSys.OrgSystem.FindUnit(iDept,'','');
                  DsPersonRole.FieldByName('FDeptID').AsString:=lDept.ID;           //部门ID
                  DsPersonRole.FieldByName('FDept').AsString:=lDept.DisplayName;    //部门
                  DsPersonRole.Post;
                end;
              end;
              IsSelected:=True;
              DataSetSelectNode.Next;
          end
        else
        begin
          DataSetSelectNode.Next;
        end;
      end;                                                                    //更新项目人员表。
    finally
      DataSetSelectNode.EnableControls;
      DsPersonRole.EnableControls;
      if Bookmark<>'' then
        DataSetSelectNode.Bookmark:=Bookmark;
      DsPersonRole.Filter:='FNodeID='''+DataSetSelectNode.FieldByName('FNodeID').AsString+'''';
      DsPersonRole.Filtered:=True;
    end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-9 14:03:48 | 显示全部楼层
请问有什么好办法可以替换locate定位吗。这个我测了一下。它几乎占一半的时间。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-12 18:13 , Processed in 0.047248 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表