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
Antwort Antwort
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
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

AW: Memorystream in VarBinary(Max) speichern

  Alt 12. Jun 2020, 11:52
Mein erstes Vorgehen wäre:
Den Stream vor dem Speichern in der Datenbank als Datei zu speichern.
Den Stream nach dem Lesen aus der Datenbank als Datei speichern.

Diese Dateien miteinander vergleichen.

Gibt es Unterschiede?

Dann macht das Speichern und / oder Auslesen aus der DB irgendwas kaputt. Welche Unterschiede gibt es genau?

Sind die Dateien identisch, so liegt das Problem nicht beim Speichern in der Datenbank.

Hierdurch könnte man jedoch den Bereich der Fehlersuche schonmal etwas einschränken.

Da ich die Komponenten nicht kenne nur hypothetisch:

Gibt es sowas wie ParamGrdView.SaveToFile analog zu ParamGrdView.StoreToStream?
Unterscheiden sich in diesem Fall ggfls. die per ParamGrdView.SaveToFile gespeicherte Datei und die per LayoutStream.SaveToFile gespeicherte Datei?
  Mit Zitat antworten Zitat
ioster

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

AW: Memorystream in VarBinary(Max) speichern

  Alt 12. Jun 2020, 12:39
Danke für den Hinweis. So etwas in der Art hatte ich schon gemacht. Das Grid bietet zudem die Möglichkeit, das Layout als Ini-Datei oder Registryeintrag zu speichern.

Da es über die Ini-Datei auch nicht funktionierte habe ich nun den Ablauf nochmal gründlich mit dem Debugger durchleuchtet und wie es so ist, das Problem sitzt vor dem Bildschirm und sieht den Wald vor lauter Bäumen nicht

In einer anderen verschämten Ecke des Programms fand sich diese Zeile:

Suchdialog.GrdUebersichtView.DataController.Filter.Clear; die nach dem Laden des Layouts alle Filter zunichte macht. Ich hatte nach dem Begriff Filter das Programm die ganze Zeit abgesucht und habe auch den Support gefragt, ob es noch eine Methode oder Eigenschaft geben könnte, die die Bemühungen übersteuert. Die Zeile auskommentiert und alles ist wie gewünscht.

Die Syntax für die Speicherung und das Laden des Layouts per Stream in die Datenbank ist demnach in Ordnung und kann gerne für eigene Projekte genutzt werden.

Viele Grüße
Ingo
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz