1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| //------------------------------------------------------------------------------
(* SoLuTions is an Versatile Library for Delphi -
* -
* Copyright "SLT Solutions", (©2006) -
* contributeur : ShaiLeTroll (2012) - Création du TSLTClientDataSetAssistant en C++Builder 2007
* contributeur : ShaiLeTroll (2015) - Traduction du TSLTClientDataSetAssistant en Delphi XE2
* -
* -
* Ce logiciel est un programme informatique servant à aider les développeurs -
* Delphi avec une bibliothèque polyvalente, adaptable et fragmentable. -
* -
* Ce logiciel est régi par la licence CeCILL-C soumise au droit français et -
* respectant les principes de diffusion des logiciels libres. Vous pouvez -
* utiliser, modifier et/ou redistribuer ce programme sous les conditions -
* de la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA -
* sur le site "http://www.cecill.info". -
* -
* En contrepartie de l'accessibilité au code source et des droits de copie, -
* de modification et de redistribution accordés par cette licence, il n'est -
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, -
* seule une responsabilité restreinte pèse sur l'auteur du programme, le -
* titulaire des droits patrimoniaux et les concédants successifs. -
* -
* A cet égard l'attention de l'utilisateur est attirée sur les risques -
* associés au chargement, à l'utilisation, à la modification et/ou au -
* développement et à la reproduction du logiciel par l'utilisateur étant -
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à -
* manipuler et qui le réserve donc à des développeurs et des professionnels -
* avertis possédant des connaissances informatiques approfondies. Les -
* utilisateurs sont donc invités à charger et tester l'adéquation du -
* logiciel à leurs besoins dans des conditions permettant d'assurer la -
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, -
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. -
* -
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez -
* pris connaissance de la licence CeCILL-C, et que vous en avez accepté les -
* termes. -
* -
*----------------------------------------------------------------------------*)
unit SLT.DB.DBClient;
interface
uses Data.DB, Datasnap.DBClient, MidasLib, Datasnap.Provider;
type
/// <summary>Boite à outil pour la classe TClientDataSet</summary>
/// <remarks>Le TSLTClientDataSetAssistant n'est pas un class helper car cela n'était pas possible sous C++Builder 2007</remarks>
TSLTClientDataSetAssistant = class(TObject)
class function CloneDataSet(ADataSet: TDataSet): TDataSet;
class function IsRecordCountable(ADataSet: TDataSet): Boolean;
end;
implementation
//------------------------------------------------------------------------------
class function TSLTClientDataSetAssistant.CloneDataSet(ADataSet: TDataSet): TDataSet;
var
ClientDS: TClientDataSet absolute Result;
ProviderDS: TDataSetProvider;
begin
ClientDS := TClientDataSet.Create(nil);
ProviderDS := TDataSetProvider.Create(nil);
try
// Je préfère SetProvider par rapport à ProviderName et sa bidouille avec le Owner !
ClientDS.SetProvider(ProviderDS);
try
ClientDS.PacketRecords := -1; // garanti la copie des données !
ProviderDS.DataSet := ADataSet;
ClientDS.Open(); // Copie les Données d'un seul coup !
// Par Défaut LogChanges est à true, ainsi les modifications restent en mémoire et cela ne tente pas d'altérer un DataSet qui encore lié malencontreusement sans un appel explicite à ApplyUpdates
// Attribuez la valeur false à LogChanges si vous n'avez pas l'intention de mettre à jour la base de données avec les modifications de l'ensemble de données client
// Avec le finally, il n'y a pas de risque d'un lien malencontreux
ClientDS.LogChanges := False;
finally
ClientDS.SetProvider(nil); // on détache, on ne conserve que la copie en mémoire
end;
finally
ProviderDS.Free();
end;
end;
//------------------------------------------------------------------------------
class function TSLTClientDataSetAssistant.IsRecordCountable(ADataSet: TDataSet): Boolean;
begin
Result := (ADataSet is TClientDataSet) and (TClientDataSet(ADataSet).PacketRecords = -1);
end;
end. |
Partager