AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Memorystream in VarBinary(Max) speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Memorystream in VarBinary(Max) speichern

Ein Thema von ioster · begonnen am 12. Jun 2020 · letzter Beitrag vom 12. Jun 2020
 
ioster

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

Memorystream in VarBinary(Max) speichern

  Alt 12. Jun 2020, 12: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz