2009-04-27 7 views
0

Je suis la fixation d'un C++ Builder 5 application et j'ai ce code:GotoBookmark trop lent?

void __fastcall TFPrincipal::DBGModuleStartDrag(TObject *Sender, 
     TDragObject *&DragObject) 
{ 
    m_pParentNodesDragDrop = NULL; 
    DragObject = NULL; 
    bool bAbort = false; 
    m_ListaModulosDragDrop->Clear(); 
    m_ListaContenedoresDragDrop->Clear(); 
    CInfoNode *pInfoNode = NULL; 
    CInfoModule *pInfoMod = NULL ; 
    long l_IdContainerParent = 0; 
    TDataSet * DataSet = NULL; 

    m_pLastDragNode = NULL; 
    m_bLastAccept = false; 

    try 
    { 
     IProductsPtr ProductsPtr = 
       m_pgServerConnection->Create<IProducts>(CLSID_CProducts); 
     if(DBGModules) 
     { 
      if (DBGModules->DataSource) 
      { 
       if (DBGModules->DataSource->DataSet) 
       { 
        DataSet = DBGModules->DataSource->DataSet; 
        DataSet->DisableControls(); 
       } 
       else return; 
      } 
      else return; 
     } 
     else return; 
     for (int i = 0; i < DBGModules->SelectedCount; i++) 
     { 
      DataSet->GotoBookmark(DBGModules->SelectedRows[i].c_str()); 


      pInfoMod = new CInfoModule(DataSet->FieldByName("IP")->AsString, 
        (long)DataSet->FieldByName("IdComputer")->AsInteger, 
        (Products)DataSet->FieldByName("IdProduct")->AsInteger, 
        DataSet->FieldByName("Host")->AsString, 
        DataSet->FieldByName("Instance")->AsString, 
        DataSet->FieldByName("Version")->AsString, 
        DataSet->FieldByName("AditionalInfo")->AsString, 
        (Antivirus)DataSet->FieldByName("IdAntivirus")->AsInteger, 
        DataSet->FieldByName("NumNotPadmin3AV")->AsInteger, 
        DataSet->FieldByName("NumPadmin3AV")->AsInteger, 
        false, 
        (long)DataSet->FieldByName("IdUnit")->AsInteger, 
        (long)DataSet->FieldByName("IdUnitForInstall")->AsInteger); 
      DataSet->FreeBookmark(DataSet->GetBookmark()); 

      pInfoNode = new CInfoNode(); 
      pInfoNode->m_pInfoModule = pInfoMod; 
     // Platree::TPlaTreeNode *pNodoSeleccionado = pInfoNode; 


     // if (pNodoSeleccionado) 
     { 
     // guardamos el padre de uno de los nodos seleccionados para 
     // el drag & drop para que usarlo luego para que aparezca desplegada 
     // la rama de origen del nodo movido y la rama de destino tras 
     // el refresco (parametro del ReloadTree) 
     // if (! m_pParentNodesDragDrop) 
     // m_pParentNodesDragDrop = pNodoSeleccionado->Parent; 

      //CInfoNode *pInfoNodoSeleccionado; 
      //pInfoNodoSeleccionado = (CInfoNode *)pNodoSeleccionado->Data; 


      if (pInfoNode->IsModule()) 
      { 
      long l_IdContainerParent = 0; 
      m_ListaModulosDragDrop->AddObject(pInfoMod->m_asDisplayName, 
               (TObject*)pInfoNode); 
     /* TESTHR(ProductsPtr->GetIDContainer(pInfoMod->m_lIdComputer, 
             pInfoMod->m_pdIDProduct, 
             WideString(pInfoMod->m_asInstance), 
             &l_IdContainerParent));*/ 

      CInfoDragNode *pInfoDragNode = new CInfoDragNode(); 
      pInfoDragNode->m_asInstance = pInfoMod->m_asInstance; 
      pInfoDragNode->m_lIdComputer = pInfoMod->m_lIdComputer; 
      pInfoDragNode->m_lIdContainerParent = /*l_IdContainerParent*/0; 
      pInfoDragNode->m_pdIDProduct = pInfoMod->m_pdIDProduct; 

      m_ListaContenedoresDragDrop->Add(
        reinterpret_cast<void*>(pInfoDragNode) 
      ); 
      } 
      else 
      { 
      bAbort = true; 
      break; 
      } 
     } 
    /* delete pInfoNode; 
     delete pInfoMod;*/ 
     DataSet->EnableControls(); 
     } 
     if (bAbort) 
     { 
     // alguno de los items seleccionados no es un módulo 
     m_ListaModulosDragDrop->Clear(); 
     } 
    } 
    catch (const nm_error::__com_error_ &e) 
    { 
     PutDebugMessage(COMError2str(e)); 
     m_ListaModulosDragDrop->Clear(); 
    } 
} 

et moi avons remarqué la ligne DataSet-> GotoBookmark (DBGModules-> SelectedRows [i] .c_str()); est en cours d'exécution lente. Pourquoi est-ce possible? La grille utilisée provient de DevExpress

+1

Quelle base de données utilisez-vous? – stukelly

+0

MS SQLServer. Ça compte? –

Répondre

1

Il se peut que votre GotoBookmark entraîne l'exécution répétée de la requête derrière le DataSet. Il peut être préférable d'exécuter une requête plus spécifique en fonction de la ligne sélectionnée, plutôt que d'accéder à un signet dans les résultats d'une requête plus générique.

2

La fonctionnalité GotoBookmark et l'utilisation des filtres dans les jeux de données dans Delphi et C++ Builder sont connues pour être un goulot d'étranglement des performances très sérieux. Ma suggestion serait d'utiliser un mécanisme différent pour sauter à l'enregistrement requis. Peut-être simplement en utilisant une requête et un identifiant. Si cela n'est pas possible, assurez-vous d'avoir des index sur les champs utilisés comme clé de signet.