Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#1

Dataset immer wieder neu erstellen (create/free) oder ein mal bei Bedarf

  Alt 12. Feb 2016, 10:33
Datenbank: MsSQL • Version: 2008 R2 • Zugriff über: ADO
Hallo zusammen,

bei uns in der Firma gibt es gerade Diskussionen um zwei verschiedene Philosophien, wie auf Daten zugegriffen werden kann.

Philosophie 1:
In einem Datenmodul wird fix ein TAdoDataset platziert, das bei ersten Gebrauch geöffnet wird und danach über ähnliche Schnittstellen wie unten angesprochen wird


Philosophie 2:
Das Dataset wird bei jedem Bedarf erstellt, die gesuchten Daten an ein fDataset übergeben und das Dataset danach wieder freigegeben.
Delphi-Quellcode:
 TBaseDataObject = Class
  Private

    /// <summary>
    /// backing field number list, will be filled each time data is loaded
    /// </summary>
    fNumberList: TIntegerList;

    /// <summary>
    /// backing field for where conditions to get data
    /// </summary>
    fWhereConditions: TStringList;

    /// <summary>
    /// backing field for order statements to get data
    /// </summary>
    fOrderStaments: TStringList;

    /// <summary>
    /// backing field for dataset for binding in grids
    /// </summary>
    fDataSet: TCustomClientDataSet;

....

Function TBaseDataObject.GetDataSet: TADODataSet;
Var
  lRealDataSet: TADODataSet;
Begin
  lRealDataSet := TADODataSet.Create(Nil);
  lRealDataSet.Connection := GetConnection();
  lRealDataSet.BeforeOpen := TDataTableOpenEvents.DataTableBeforeOpen;
  Result := lRealDataSet;
End;

// -----------------------------------------------------------------------------
Procedure TBaseDataObject.Refresh;
Var
  lRealDataSet: TADODataSet;
  li: Integer;
  workingOnLocalDatabase: String;
Begin
  fDataSet.DisableControls; // avoiding flicker

  lRealDataSet := GetDataSet;


  lRealDataSet.CommandText := getSelectStatement;
  fDataSet.EmptyDataSet;
  fNumberList.Clear;

  Try
    lRealDataSet.Open;
    If lRealDataSet.RecordCount > 0 Then
    Begin
      lRealDataSet.First;
      Repeat
        fDataSet.Append;
        fNumberList.Add(StrToIntDef(lRealDataSet.FieldByName(fPkName).Value, -1));

        for li:=0 to pred(lRealDataSet.FieldCount) do { Alle Felder kopieren }
        begin
          fDataSet.FieldByName(lRealDataSet.Fields[li].FieldName).Value := lRealDataSet.Fields[li].Value;
        end;

        fDataSet.Post;
        lRealDataSet.Next;
      Until (lRealDataSet.Eof);
    End
    Else
      Logger.Debug('TBaseDataObject.Refresh', 'No data for table %s [%s]', [fTableName, getSelectStatement]);
  Except
    On E: Exception Do
      Logger.Fatal('TBaseDataObject.Refresh', 'Could not get field definitions for table %s, Field %S Exeption: %s', [fTableName, lRealDataSet.Fields[li].FieldName, E.Message]);
  End;
  fDataSet.First;
  DataBase.FreeDataSet(lRealDataSet);
  fActive := true;
  fDataSet.EnableControls;
End;
Der Unterschied könnte auch darauf reduziert werden, dass das Dataset in einem Fall einmal geöffnet wird und dann immer wieder verwendet wird und im anderen Fall jedes mal befreit und wieder neu erstellt wird.

Welche Auswirkungen hat die dauernde Neuerstellung auf Laufzeit und Netzbelastung?
Was spricht aus eurer Sicht für / gegen die eine oder andere Methode?

Wäre froh um ein paar unabhängige Meinungen

Danke
Gerd
  Mit Zitat antworten Zitat