2010-02-23 4 views
3

Scenerio:Lecture de la structure DataSet sans lire ses données

Je souhaite ajouter un champ calculé à un ensemble de données donné (quelconque) pendant l'exécution. Je ne connais pas d'autre moyen d'obtenir une structure de jeu de données autre que l'exécution de la méthode DataSet.Open.

Mais la méthode Open entraîne qu'au moins une ligne d'une donnée doit être transférée du serveur au client. Ensuite, je dois fermer le DataSet, ajouter un champ et le rouvrir. C'est un surcoût inutile à mon avis. Existe-t-il une meilleure façon de le faire? S'il vous plaît ne pas que je veux pouvoir ajouter un champ calculé à n'importe quel ensemble de données et je ne connais pas sa structure avant l'ouverture.

En pseudocode il ressemble à ceci:

DataSet.Open; 
DataSet.Close; 
RecreateFieldsStructure; 
AddCalculatedField; 
DataSet.Open; 

Merci pour votre temps.

Répondre

11

Vous pouvez utiliser la méthode DataSet.FieldDefs.Update. Cela impliquera toujours un transfert de données mais aucune ligne ne sera récupérée. Vous pouvez appeler cette méthode dans l'événement BeforeOpen du TDataSet et y ajouter également les champs calculés.

Voici un petit exemple qui fonctionne pour moi:

procedure TDataModule.cdsExampleBeforeOpen(DataSet: TDataSet); 
var I: Integer; 
    TmpField: TDateTimeField; 
begin 
    // Get field definitions from the server 
    DataSet.FieldDefs.Update; 

    // Add calculated field 
    TmpField := TDateTimeField.Create(DataSet); 
    with TmpField do 
    begin 
    Name := 'Date'; 
    FieldName := 'Date'; 
    DisplayLabel := 'Date'; 
    DisplayFormat := 'ddd ddddd'; 
    Calculated := True; 
    end; 
    TmpField.DataSet := DataSet; 

    // Create fields from field definitions 
    for I := 0 to DataSet.FieldDefs.Count - 1 do 
    DataSet.FieldDefs[I].CreateField(DataSet); 
end; 
+0

+1. Bon à savoir. –

+0

Merci, exactement ce que je voulais. +1 – Wodzu

3

Si je comprends bien votre question; vous voulez voir/connaître la structure des tables avant d'appeler la méthode ADOQuery (open). si ce que vous voulez, vous pouvez utiliser les méthodes de ADOConnection comme (GetFieldNames) et ici un exemple de la façon d'obtenir les noms des champs de la table (EMP):

procedure TForm2.Button1Click(Sender: TObject); 
var 
    lstFields: TStringList; 
begin 
    lstFields := TStringList.Create; 
    try 
    ADOConnection1.GetFieldNames('EMP', lstFields); 
    finally 
    lstFields.Free; 
    end; 
end; 

alors tous les noms des champs sont maintenant sur (lstFields) . J'espère que cela aidera.

Cordialement.

+0

Merci Issam, malheureusement cette méthode ne me donne que des noms de champs qui ne sont pas suffisants pour recréer la structure de l'ensemble de données. J'ai aussi besoin d'un type de champ particulier. Quoi qu'il en soit, je donne +1 car c'est une méthode utile. – Wodzu

Questions connexes