Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze (https://www.delphipraxis.net/214123-invalid-blob-handle-record-buffer-bei-2-durchlaufen-der-datensaetze.html)

Bodenseematze 7. Dez 2023 13:15

AW: "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Zitat:

Zitat von Bodenseematze
Bezieht das jegliche VARCHAR-Spalten mit ein? Oder nur die "langen"?

Bezieht sich wohl auf alles, was nicht einer festen Länge entspricht. Und da fällt halt VarChar (leider) auch drunter.

:shock:

Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Diese Frage verstehe ich nicht so recht. Bei den mir bekannten BDE-Komponenten TTable und TQuery gibt es keine Möglichkeit um jeweils SQL-INSERT/-UPDATE/-DELETE-Statements anzugeben.

Man kann über das TQuery-Property
Delphi-Quellcode:
UpdateObject
DeleteSQL, InsertSQL und ModifySQL-Statements angeben;
s.a. https://docwiki.embarcadero.com/Libr...t.UpdateObject
Und so ein UpdateObject habe ich bei
Delphi-Quellcode:
TADOQuery
nicht gefunden...
EDIT: auch FireDAC hat in seiner Query-Klasse
Delphi-Quellcode:
TFDQuery
ein
Delphi-Quellcode:
UpdateObject
; auch die Interbase-Variante hat sowas - nur eben anscheinend die ADO-Variante nicht... :?:

Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Zitat:

Zitat von Bodenseematze
..., das bedeutet doch aber, dass man die Speicherung (wenn der SELECT auf einem nicht updatebare DB-View stattfindet) manuell machen muss, oder?

ja.

Das wäre doof - aber natürlich machbar (ggf. über eine Ableitung...) ;-)

Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Eigentlich ja. Wie kommen denn momentan die Daten in die Paradoxtabellen? Werden die Daten überhaupt zwingend als Datenbankdateien auf der Festplatte benötigt?

Vergiss' mal die Paradox-Tabellen - die sind "flach" und tabellenmäßig einfach und werden mit technischen Berechnungsergebnissen direkt vor dem Aufruf von CrystalReports gefüllt; dafür werden z.Zt. TTable-Objekte verwendet...

Die o.a. TQuery sind für die Abfrage und Änderung der Daten vom MS-SQLServer da - das ist (datenbanktechnisch) der wesentlich komplexere Teil...

Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Wenn nein, sollte es möglich sein an der Stelle, an der momentan die Daten in die Paradoxtabellen kommen, TClientDataSet bzw. TJvMemoryData (oder alles, was "irgendwie" von TDataSet abgeleitet wurde und nur im Speicher vorhanden ist) einzusetzen.

Ich bin da auf der Suche nach Beispielen / Erklärungen, wie das über Master-/Detail-Beziehungen mit Bezügen zu "echten" Datenbank-Datasets inkl. am besten gemacht wird...

Ich habe da noch eine (automatische) Hintergrund-Auswertung der TField-Objekte auf den Masken um geänderte Datenbankfelder optisch zu markieren - das sollte damit natürlich auch noch funktionieren / durdchführbar sein ;-)


Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Statt Paradox per BDE wäre aber auch noch der Einsatz von TDBF möglich.

Das schaue ich mir auf jeden Fall mal genauer an - das DBF-Format wäre tatsächlich eine Option; wobei dann ca. 150 Reportdateien angepasst werden müssten - das ist dann auch wieder eine nicht zu unterschätzender Aufwand.
Da gefällt mir die Möglichkeit, das über MS Paradox ODBC-Treiber zu lösen, wesentlich besser :P

Delphi.Narium 7. Dez 2023 14:58

AW: "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze
 
Zitat:

Zitat von Bodenseematze (Beitrag 1530527)
Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Diese Frage verstehe ich nicht so recht. Bei den mir bekannten BDE-Komponenten TTable und TQuery gibt es keine Möglichkeit um jeweils SQL-INSERT/-UPDATE/-DELETE-Statements anzugeben.

Man kann über das TQuery-Property
Delphi-Quellcode:
UpdateObject
DeleteSQL, InsertSQL und ModifySQL-Statements angeben;
s.a. https://docwiki.embarcadero.com/Libr...t.UpdateObject
Und so ein UpdateObject habe ich bei TADOQuery nicht gefunden...

Jetzt arbeite ich schon seit gefühlt 'nem viertel Jahrhundert mit Delphi, aber die Property ist mir bei TQuery noch nicht aufgefallen :-( Zeit für die Rente ;-) 'ne, hat TADO... nicht.

Zitat:

Zitat von Bodenseematze (Beitrag 1530527)
Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Eigentlich ja. Wie kommen denn momentan die Daten in die Paradoxtabellen? Werden die Daten überhaupt zwingend als Datenbankdateien auf der Festplatte benötigt?

Vergiss' mal die Paradox-Tabellen - die sind "flach" und tabellenmäßig einfach und werden mit technischen Berechnungsergebnissen direkt vor dem Aufruf von CrystalReports gefüllt; dafür werden z.Zt. TTable-Objekte verwendet...

TDBF könnte weitgehend mit TTable kompatibel sein, zumindest die Sachen, die für einfaches Datenrein, Datenraus genutzt werden.

Einkonstrukt TDBGrid - TDataSource - TTable kann problemlos in TDBGrid - TDataSource - TDBF umgewandelt werden, da beides Nachkommen von TDataSet. Überall dort, wo zwischen der Datenverarbeitung, Report, Datenanzeige ein TDataSource steckt, sollte daher TTable durch TDBF ausgetasucht werden können. Wie werden die TTables befüllt? Sinngemäß sowas?
Delphi-Quellcode:
  while not IrgendeineDBKomponente.EoF do begin
    TTable.Append;
    TTable.FieldByName('irgendwas').AsIrgendeinTyp := IrgendeineDBKomponente.Fields[0].AsIrgendEinType; // hier können auch Funktionsergebnisse hinterstecken ...
    ...
    TTable.Post
    IrgendeineDBKomponente.Next;
  end;
Das sollte mit TDBF funktionieren, grob gesagt: TTable wegwerfen und durch TDBF gleichen Namens ersetzen, wäre die einfachste Möglichkeit. Hoffentlich hast Du da das Glück, dass es so einfach geht.
Zitat:

Zitat von Bodenseematze (Beitrag 1530527)
Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Wenn nein, sollte es möglich sein an der Stelle, an der momentan die Daten in die Paradoxtabellen kommen, TClientDataSet bzw. TJvMemoryData (oder alles, was "irgendwie" von TDataSet abgeleitet wurde und nur im Speicher vorhanden ist) einzusetzen.

Ich bin da auf der Suche nach Beispielen / Erklärungen, wie das über Master-/Detail-Beziehungen mit Bezügen zu "echten" Datenbank-Datasets inkl. am besten gemacht wird...

Meinst Du über die Attribute MasterSource und MasterFields? Die hat TClientDataSet auch. Damit dürfte es eigentlich keine grundsätzlichen Unterschiede geben, aber wer weiß. Da müsst man jetzt echt mal in die Quelltexte Deiner Software schauen, um sinnvoll helfen zu können.
Zitat:

Zitat von Bodenseematze (Beitrag 1530527)
Ich habe da noch eine (automatische) Hintergrund-Auswertung der TField-Objekte auf den Masken um geänderte Datenbankfelder optisch zu markieren - das sollte damit natürlich auch noch funktionieren / durdchführbar sein ;-)

Hier wäre ich optimistisch, dass das durch Austausch der Datenbankkomponenten trotzdem transparent bleibt und "einfach" funktioniert.
Zitat:

Zitat von Bodenseematze (Beitrag 1530527)
Zitat:

Zitat von Delphi.Narium (Beitrag 1530525)
Statt Paradox per BDE wäre aber auch noch der Einsatz von TDBF möglich.

Das schaue ich mir auf jeden Fall mal genauer an - das DBF-Format wäre tatsächlich eine Option; wobei dann ca. 150 Reportdateien angepasst werden müssten - das ist dann auch wieder eine nicht zu unterschätzender Aufwand.
Da gefällt mir die Möglichkeit, das über MS Paradox ODBC-Treiber zu lösen, wesentlich besser :P

Wenn die Minus Eins im Blobcache das Problem gelöst hat, wäre die Umstellung auf den ODBC-Treiber auch meine erste Option.

Bodenseematze 7. Dez 2023 16:15

AW: "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze
 
[QUOTE=Delphi.Narium;1530533]
Zitat:

Zitat von Bodenseematze (Beitrag 1530527)
Jetzt arbeite ich schon seit gefühlt 'nem viertel Jahrhundert mit Delphi, aber die Property ist mir bei TQuery noch nicht aufgefallen :-( Zeit für die Rente ;-) 'ne, hat TADO... nicht.

:lol:

Zitat:

Zitat von Delphi.Narium (Beitrag 1530533)
TDBF könnte weitgehend mit TTable kompatibel sein, zumindest die Sachen, die für einfaches Datenrein, Datenraus genutzt werden.

Ja, das schon - aber wie gesagt: der Aufwand liegt hier auf der Reportseite, wenn hier 150 Reports angepasst werden müssen
--> da werde ich versuchen, auf die Variante mit der MS Paradox-Schnittstelle umzustellen...


[QUOTE=Delphi.Narium;1530533]Wie werden die TTables befüllt? Sinngemäß sowas?
Delphi-Quellcode:
  while not IrgendeineDBKomponente.EoF do begin
    TTable.Append;
    TTable.FieldByName('irgendwas').AsIrgendeinTyp := IrgendeineDBKomponente.Fields[0].AsIrgendEinType; // hier können auch Funktionsergebnisse hinterstecken ...
    ...
    TTable.Post
    IrgendeineDBKomponente.Next;
  end;
Ja, und bei mir ist es sogar noch einfacher, weil die TTable immer nur einen Datensatz hat...

Zitat:

Zitat von Delphi.Narium (Beitrag 1530533)
Meinst Du über die Attribute MasterSource und MasterFields? Die hat TClientDataSet auch. Damit dürfte es eigentlich keine grundsätzlichen Unterschiede geben, aber wer weiß. Da müsst man jetzt echt mal in die Quelltexte Deiner Software schauen, um sinnvoll helfen zu können.

Nein, ich meinte das prinzipielle Verhalten mit Events, Updates, Öffnen, Schließen, Sätze weiterschalten etc. und was ich (sinnvollerweise) wo und wie miteinander verknüpfen muss, um das Master-/Detail-Verhalten zu erreichen.

Zitat:

Zitat von Delphi.Narium (Beitrag 1530533)
Wenn die Minus Eins im Blobcache das Problem gelöst hat, wäre die Umstellung auf den ODBC-Treiber auch meine erste Option.

Scheint aktuell so :thumb:

Delphi.Narium 7. Dez 2023 17:23

AW: "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze
 
Zitat:

Zitat von Bodenseematze (Beitrag 1530535)
Zitat:

Zitat von Delphi.Narium (Beitrag 1530533)
TDBF könnte weitgehend mit TTable kompatibel sein, zumindest die Sachen, die für einfaches Datenrein, Datenraus genutzt werden.

Ja, das schon - aber wie gesagt: der Aufwand liegt hier auf der Reportseite, wenn hier 150 Reports angepasst werden müssen
--> da werde ich versuchen, auf die Variante mit der MS Paradox-Schnittstelle umzustellen...

Greifen denn die Reports direkt auf TTable / TQuery oder die Paradoxdateien zu oder liegt da noch 'ne TDataSource zwischen?
Liegt da noch 'ne TDataSource zwischen, sollte es reichen dieser beim DataSet "einfach" eine andere Datenbankkomponente zuzuweisen. Solange sich weder Spaltenname noch Spaltentyp ändern, sollte der Austausch der Datenbankkomponenten ohne weiteres funktionieren.

Report -> TDataSource -> TTable
kann man ändern in
Report -> TDataSource -> TDBF
oder
Report -> TDataSource -> TADOTable
oder
Report -> TDataSource -> TClientDataSet

Zitat:

Zitat von Bodenseematze (Beitrag 1530535)
Zitat:

Zitat von Delphi.Narium (Beitrag 1530533)
Meinst Du über die Attribute MasterSource und MasterFields? Die hat TClientDataSet auch. Damit dürfte es eigentlich keine grundsätzlichen Unterschiede geben, aber wer weiß. Da müsst man jetzt echt mal in die Quelltexte Deiner Software schauen, um sinnvoll helfen zu können.

Nein, ich meinte das prinzipielle Verhalten mit Events, Updates, Öffnen, Schließen, Sätze weiterschalten etc. und was ich (sinnvollerweise) wo und wie miteinander verknüpfen muss, um das Master-/Detail-Verhalten zu erreichen.

Eigentlich ist das Meiste identisch. Alles, was von TDataSet geerbt wurde, stimmt überein.

Open, Close, BeforePost, AfterScroll, Active ... haben die alle und es verhält sich überall gleich. Auch die Zuweisung der Ereignisroutinen im Objektinspektor sollte gleich sein.

Hast Du für eine TTable z. B. eine Routine für AfterScroll, so kannst Du genau diese Routine auch 'ner TADO... beim AfterScoll zuweisen. Solange im Quelltext der Routinen nicht auf die Datenbankkomponente zugegriffen wird, sondern nur über den im Prozedurekopf übergebenen DataSet, sollte das transparent sein. Selbst wenn Du eine TTable durch eine TDBF ersetzt und der Name nicht verändert wird, sollte das problemlos gehen.

Z. B: Du hast eine TTable mit dem Namen Tail. Die schmeist Du nun weg und nimmst eine TDBF mit dem Namen Tail. Dann sollte das ohne weitere Änderung funktionieren, analog mit TADOTable oder TADOQuery, TClientDataSet, ...

Zitat:

Zitat von Bodenseematze (Beitrag 1530535)
Zitat:

Zitat von Delphi.Narium (Beitrag 1530533)
Wenn die Minus Eins im Blobcache das Problem gelöst hat, wäre die Umstellung auf den ODBC-Treiber auch meine erste Option.

Scheint aktuell so :thumb:

Das heißt dann ja zumindest schonmal, dass es an dieser Baustelle nicht brennt und Du in Ruhe nach der bestmöglichen Alternative suchen kannst.

Bodenseematze 11. Dez 2023 13:05

AW: "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1530545)
Greifen denn die Reports direkt auf TTable / TQuery oder die Paradoxdateien zu

Die Reports sind Dateien mit der Endung .rpt die ein eigenes, von Crystal Reports definiertes Format vorweisen.
Sie können nur mit CR geöffnet werden und greifen dann auf Datenbanken und Drucker etc. zu, indem sie die in CR zur Verfügung stehenden Schnittstellen verwenden;
Mit dem Delphi-Wrapper, der für ältere Delphi-Versionen von CR zur Verfügung gestellt wurde, hat man die Möglichkeit, diesen Reportdateien sozusagen Parameter mitzugeben, wie z.B. welche Datenbankverbindung sie verwenden sollen oder welche(n) Datensatz sie aus der Datenbank nehmen sollen oder welchen Drucker sie verwenden sollen;
und dann lässt sich über die Schnittstelle auch noch CR selber (grob) steuern, d.h. z.B. eine Druckausgabe anstoßen oder ein Vorschaufenster öffnen
(es geht noch mehr mit der Schnittstelle aber das ist es größtenteils, was in meinem Fall verwendet wird).
d.h. bzgl. Datenbankzugriff wird in meinem Fall den Reports beim Öffnen der MS SQL (bzw. ODBC)-Datenquellname mitgegeben sowie die ID des Master-Datensatz, den sie einlesen sollen sowie das Verzeichnis, in dem die lokale Paradox-Datenbank liegt.
Die Reportdateien selber wissen nichts von Delphi - oder den Komponenten in Delphi...

Zitat:

Zitat von Bodenseematze (Beitrag 1530535)
Das heißt dann ja zumindest schonmal, dass es an dieser Baustelle nicht brennt und Du in Ruhe nach der bestmöglichen Alternative suchen kannst.

Jein :wink: ich habe noch ein (neues) Problem, bei dem ich auch nicht so recht weiß, woher es kommt - das werde ich jetzt mal versuchen, in einem neuen Thema zu formulieren...

Auf jeden Fall habe ich noch eine mehrere eigene Hilfsklassen, in der Vereinfachungen für die Datenbank-Queries und die Datenbank selber enthalten sind - die waren sehr TQuery/TDatabase lastig; die stelle ich gerade um, so dass die Schnittstellen TDataSet und TCustomConnection sind und erst intern dann je nach tatsächlich übergebenem Typ (z.B. TQuery vs. TADOQuery) unterschieden wird und unterschiedliche Aufrufe durchgeführt werden bzw. Properties gesetzt / abgefragt werden.
Das als Vorbereitung, das noch weiter zu abstrahieren bzw. eine andere Datenbankschnittstelle zu verwenden...

Der Teil mit den TTable und der Füllung der Paradox-Dateien ist sowieso komplett extra - das könnte ich dann relativ getrennt vom Rest umstellen...

Bodenseematze 19. Dez 2023 07:53

AW: "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze
 
Ich bin jetzt auf die ZeosLib gestoßen - sieht so auf den ersten Blick vielversprechend aus.

@Delphi.Narium: hast Du mit der vielleicht Erfahrung?

Allerdings müsste ich zur Verwendung für mein Szenario auf die Beta-Version v8 aufsetzen (damit auch ODBC-Verbindungen unterstützt werden).
Und die bekomme ich bei mir nicht mit / für Delphi 7 übersetzt.

Und das Forum dort ist auch ziemlich mühsam...
...da habe ich mich zwar angemeldet und eine entsprechende Frage gestellt - die Frage taucht aber noch nicht auf, weil erst ein Moderator die Frage freigeben muss (das war vor mehr als zwei Tagen).
Ich hoffe, das ist nur bei der ersten Frage ein Problem und danach muss nicht jeder einzelne Beitrag über einen Moderator freigeschaltet werden... :roll:

Auch deswegen meine Frage: lohnt es sich, sich mit der Library auseinanderzusetzen?

haentschman 19. Dez 2023 08:13

AW: "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze
 
Hallöle...8-)
Zitat:

Auch deswegen meine Frage: lohnt es sich, sich mit der Library auseinanderzusetzen?
Ja. :wink:
Zitat:

Ich greife mit Delphi 7 über die BDE auf eine Datenbank auf einem MSSQL-Server 2019 (v15.0.4326.1) zu.
...wie du schon gesehen hast, geht es mit ZEOS.(ohne BDE)
Zitat:

Allerdings müsste ich zur Verwendung für mein Szenario auf die Beta-Version v8 aufsetzen (damit auch ODBC-Verbindungen unterstützt werden).
...warum ODBC? :gruebel: MSSQL und NativeTreiber 2012 sollte funktionieren. :zwinker: Download: https://www.microsoft.com/de-de/down....aspx?id=50402

PS: Persönlich hatte ich immer mit ODBC (MSSQL), auch der neueste, meine Probleme. (nicht unterstützte Funktionen = Fehler) :roll:

Delphi.Narium 19. Dez 2023 10:49

AW: "Invalid BLOB handle in record buffer." bei 2. Durchlaufen der Datensätze
 
Mit meinem Delphi 7 nutzte ich (zuweilen) ZeosLib 7.2.4-stable build at 2018-03-25 11:08:27 (https://sourceforge.net/p/zeoslib/ne...724-available/).

Wenn man dort im Objektinspektor zu eine TZConnection bei Protokoll ado auswählt und dann bei Database auf den ...-Button klickt, wird der Auswahldialog für ADO angezeigt. Dort kann man alles auswählen, was so mit ADO möglich ist. Darunter sind auch die ODBC-Treiber. Für ODBC muss also nicht zwingend die neueste Beta genutzt werden, die Delphi erst ab Tokyo unterstützt.

Da hier dann sowieso ADO genutzt wird, reicht es die bei Delphi 7 enthaltenen ADO-Komponenten zu nutzen. Die funktionieren und sind letztlich einfach zu handhaben und auch der Weg des geringsten Widerstandes. Man nutzt einfach das, was sowieso schon (neben der BDE) dabei ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.
Seite 2 von 2     12   

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