« OIDs numériques (framework) » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 22 : | Ligne 22 : | ||
<source lang=delphi> | <source lang=delphi> | ||
//Procedure TestQueryBroker; | |||
var vQuery:TQuery; aOID,xOID:TOID; inst:WFClasseA; ctn:Integer; | |||
begin | |||
//find first instance | |||
inst := WFClasseA.Find('','',True,[]); | |||
if not Assigned(inst) then Exit; | |||
aOID := inst.OID; | |||
vQuery := QueryBroker(''{URL},'Test','WFClasseA'); | |||
vQuery.Sql.Add('SELECT oid FROM '+ClassManager.FindClassTableName('WFClasseA')); | |||
vQuery.SQL.Add(Format('WHERE oid=%s',[vQuery.translator.dbOutOID(aOID)])); //!! Import use dbOutOID() to encode oid | |||
// | |||
ctn := 0; | |||
vQuery.Open; | |||
vQuery.First; | |||
while not vQuery.Eof do | |||
begin | |||
ctn := ctn+1; | |||
xOID := vQuery.Fields[0].AsVariant; // OK, Fields[] return the OID in char format | |||
vQuery.Next; | |||
end; | |||
vQuery.Close; | |||
// | |||
if (ctn=1) and (aOID=xOID) | |||
then showMessage('success') | |||
else showMessage(Format('failed :%d, %s / %s',[ctn,aoid,xoid])); | |||
end; | |||
</source> | </source> | ||
Version du 1 mars 2019 à 09:44
Une base en OIDs numériques stocke les OID en entier 64 bits au lieu de les stocker en chaîne de caractères.
Les avantages sont :
- Gain de taille, la taille d'un oid numérique est de 8 octets alors que la taille d'un oid caractère est de 32 octets
- Gain de performance, le serveur SQL est plus performant dans la manipulation d'entier.
- Gain réseau, le volume de données échangé est réduit.
![]() |
Tip : Seul le stockage est différent, le framework et le code métier utilisent toujours des OIDs au format caractère en interne |
Revue de code métier
Les éléments suivants doivent être revue pour s'assurer que le code métier est correctement implémenté :
- Queries brokers
- Curseurs utilisant une construction SQL
Les points à vérifier sont :
- Utilisation de dbOutOID() pour encoder les OIDs dans les requêtes
Exemples :
<source lang=delphi> //Procedure TestQueryBroker; var vQuery:TQuery; aOID,xOID:TOID; inst:WFClasseA; ctn:Integer; begin
//find first instance inst := WFClasseA.Find(,,True,[]); if not Assigned(inst) then Exit; aOID := inst.OID;
vQuery := QueryBroker({URL},'Test','WFClasseA'); vQuery.Sql.Add('SELECT oid FROM '+ClassManager.FindClassTableName('WFClasseA')); vQuery.SQL.Add(Format('WHERE oid=%s',[vQuery.translator.dbOutOID(aOID)])); //!! Import use dbOutOID() to encode oid // ctn := 0; vQuery.Open; vQuery.First; while not vQuery.Eof do begin ctn := ctn+1; xOID := vQuery.Fields[0].AsVariant; // OK, Fields[] return the OID in char format vQuery.Next; end; vQuery.Close; // if (ctn=1) and (aOID=xOID) then showMessage('success') else showMessage(Format('failed :%d, %s / %s',[ctn,aoid,xoid]));
end; </source>