![]() |
Datenbank: MS SQL Server • Version: 2014 • Zugriff über: FireDAC
Memorystream in VarBinary(Max) speichern
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:
Vielleicht hat ja jemand die Problemstellung schon in ähnlicher Form umgesetzt. Ich wäre für Tipps in jedem Fall dankbar.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; Viele Grüße Ingo |
AW: Memorystream in VarBinary(Max) speichern
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? |
AW: Memorystream in VarBinary(Max) speichern
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 :oops: In einer anderen verschämten Ecke des Programms fand sich diese Zeile:
Delphi-Quellcode:
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.
Suchdialog.GrdUebersichtView.DataController.Filter.Clear;
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 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-2025 by Thomas Breitkreuz