Einzelnen Beitrag anzeigen

ioster

Registriert seit: 15. Aug 2008
84 Beiträge
 
Delphi 10.3 Rio
 
#1

Memorystream in VarBinary(Max) speichern

  Alt 12. Jun 2020, 11:38
Datenbank: MS SQL Server • Version: 2014 • Zugriff über: FireDAC
Hallo zusammen,

ich möchte das Layout und den gesetzten Filter eines TcxGridDBTableView (QuantumGrid von DevExpress) in eine Tabelle einer MS SQL Datenbank schreiben.

Das Feld habe ich als VarBinary(Max) definiert, weil es den Datentypen BLOB nicht gibt. Ich habe dann eine Routine für die Speicherung und eine für das Laden der Daten geschrieben, aber ich bekomme lediglich das Layout richtig zurückgeliefert.

Da das Rücksetzen des Grids mit einem Memorystream ohne Speicherung in einer Datenbank funktioniert, zieht sich DevExpress aus der Angelegenheit heraus. Leider gibt es keine fertigen Methoden. Ich habe inzwischen unterschiedliche Verfahrensweisen ausprobiert, doch ich bekomme den Filter nicht gesetzt.

Vielleicht habe ich irgendwo einen Denkfehler oder muss noch etwas bei der Bearbeitung des Streams ändern. Für mich als auch für den Support von DevExpress ist das Verhalten jedenfalls nicht nachvollziehbar.

Delphi-Quellcode:

procedure TDatenmodul.GridLayoutSave(ParamFormname: string; ParamGrdView : TcxGridDBTableView);
  var
    Formularname : string;
    LayoutStream : TMemoryStream;
  begin
    if ParamGrdView <> nil then
      begin
        Formularname := AnsiUpperCase(ParamFormname);

        LayoutStream := TMemoryStream.Create;

        Try
          ParamGrdView.StoreToStream(LayoutStream, [gsoUseFilter, gsoUseSummary]);

          if not(Datenmodul.GridViews.Active) then
            Datenmodul.GridViews.Active := true;

          if not(Datenmodul.GridViews.Locate('Formular;Benutzer;Viewname', VarArrayOf([Formularname, Benutzername, AnsiUpperCase(ParamGrdView.Name)]),[])) then
            begin
              with Datenmodul.GridViews Do
                begin
                  Append;
                  Fieldbyname('Formular').AsString := Formularname;
                  Fieldbyname('Benutzer').AsString := Benutzername;
                  Fieldbyname('Viewname').AsString := AnsiUpperCase(ParamGrdView.Name);
                end;

            end
          else
            Datenmodul.GridViews.Edit;

          LayoutStream.Position := 0;

          if Datenmodul.GridViews.FieldByName('Layout').IsBlob then
            begin
              TBlobField(Datenmodul.GridViews.FieldByName('Layout')).LoadFromStream(LayoutStream);
            end;

          Datenmodul.GridViews.Post;

        Finally
          FreeAndNil(LayoutStream);
        End;
      end;
  end;

procedure TDatenmodul.GridLayoutLoad(ParamFormname : string; ParamGrdView : TcxGridDBTableView; ParamBerechtigung : boolean);
  var
    Formularname : string;
    LayoutStream : TMemoryStream;
  begin
    if ParamGrdView <> nil then
      begin
        Formularname := AnsiUpperCase(ParamFormname);

        if not(Datenmodul.GridViews.Active) then
          Datenmodul.GridViews.Active := true;

        if Datenmodul.GridViews.Locate('Formular;Benutzer;Viewname', VarArrayOf([Formularname, Benutzername, AnsiUpperCase(ParamGrdView.Name)]),[]) then
          begin

            try
              LayoutStream := TMemoryStream.Create;

              try
                if Datenmodul.GridViews.FieldByName('Layout').IsBlob then
                  begin
                    TBlobField(Datenmodul.GridViews.FieldByName('Layout')).SaveToStream(LayoutStream);
                    LayoutStream.Position := 0;

                    ParamGrdView.RestoreFromStream(LayoutStream, true, false, [gsoUseFilter, gsoUseSummary]);
                  end;
              except

              end;
            Finally
              FreeAndNil(LayoutStream);
            end;
          end;
      end;
  end;
Vielleicht hat ja jemand die Problemstellung schon in ähnlicher Form umgesetzt. Ich wäre für Tipps in jedem Fall dankbar.

Viele Grüße
Ingo
  Mit Zitat antworten Zitat