AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Query.Fields[x] = ftBlob, ich benötige aber ftByte
Thema durchsuchen
Ansicht
Themen-Optionen

Query.Fields[x] = ftBlob, ich benötige aber ftByte

Ein Thema von juergen · begonnen am 2. Jun 2022 · letzter Beitrag vom 2. Jun 2022
Antwort Antwort
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#1

Query.Fields[x] = ftBlob, ich benötige aber ftByte

  Alt 2. Jun 2022, 00:01
Datenbank: MSSQL • Version: 2017 • Zugriff über: FireDAC
Hallo zusammen,

ich benötige ein Query.Fields[x] vom Datentyp ftByte.
Die Tabellenspalte ist wie folgt definiert:
Code:
[x] [varbinary](max) NOT NULL
Wenn ich im Select folgendes anwende, erhalte ich in Delphi in meinem FireDac-Query-Field den Datentyp ftByte:

Code:
Select
  CONVERT(BINARY, A.x)
Dann fehlen mir aber in einigen Zeilen Werte. BINARY ist einfach zu "kurz".

Wenn ich im Select folgendes anwende, erhalte ich in meiner FireDac-Query-Field den Datentyp ftBlob.

Code:
Select
  CONVERT(VARBINARY(MAX), A.x)
Hiermit sind aber zumindest alle Werte vollständig.

Gibt es irgendeine Möglichkeit als Ergebnis eines FireDac-Query-Fields anstelle ftBlob ftByte zu erhalten?

Oder kann man "einfach" DataModul_1.Qry_A.Fields[4].AsBytes anwenden, obwohl das Field eigentlich ftBlob ist?

Das eigentliche Ziel soll sein, dass das ftByte (oder wenn es geht) auch das ftBlob in ein String umgewandelt werden muss. In den Bytes können aber alle möglichen Zeichen vorkommen, u.a auch Zeichen für Textende, so dass viele String-Operationen dann abbrechen.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen ( 2. Jun 2022 um 00:07 Uhr) Grund: Den letzten Satz hinzugefügt zur besseren Verdeutlichung
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Query.Fields[x] = ftBlob, ich benötige aber ftByte

  Alt 2. Jun 2022, 00:21
wirklich ftByte .... ein Byte ?

Oder meinst du eher ftBytes, bzw. ftVarBytes?
Also sowas wie CHAR und VARCHAR,
während ftBlob mehr sowas wie TEXT ist.

[edit]
Hmmm ... Byte ... Bytes ... hmmmmmmmmmmm

Zitat von Data.Bind.DBScope.pas:
mtUInteger, // TByteField, { ftByte }
ftByte doch mehr als 1 ?
[/edit]
[edit2]
Zitat:
TByteField represents a field that contains a byte value in a dataset.
TByteField encapsulates the fundamental behavior common to fields that contain byte data. Byte fields can hold values in the range 0 to 255, and are frequently used to hold small numerical values.
Doch richtig, sagt die Hilfe

ftByte kannte sie zwar, aber ohne Beschreibung dazu.
[/edit2]


Erstmal muß FireDac es auch "können" diesen Datenbank-FieldTyp in die Daten dieses Delphi-Fields zu übernehmen.
Dann brauchst du auch noch den passenden TField-Typen, zum ftBytes.

und wenn das geht:

entweder du erstellst die TField's selber
oder du mußt irgendwo den Typen registrieren.



Irgendwo gibt es Übersetzungstabellen (Arrays/Listen), in welchen drin steht, was zu wem übersetzt wird.
z.B. INTEGER -> eventuell noch ein ZwischenTyp in der DB-Komponente und noch Einer in der Datenbank-API -> ftInteger -> TIntegerField -> und zum Schluß haben besserere DBGrids bestimmt nochmal eine Übersetzung zum Column-Type




Zitat:
Das eigentliche Ziel soll sein, dass das ftByte (oder wenn es geht) auch das ftBlob in ein String umgewandelt werden muss. In den Bytes können aber alle möglichen Zeichen vorkommen, u.a auch Zeichen für Textende, so dass viele String-Operationen dann abbrechen.
Und wenn die Codepage / Codierung das nicht mag, dann raucht es ganz ab.

Wenn, dann natürlich so in einen String konvertieren, dass diese Probleme nicht auftauchen.
z.B. HEX, Base64, oder nur die "bösen" Zeichen irgendwie maskieren oder ersetzen.
$2B or not $2B

Geändert von himitsu ( 2. Jun 2022 um 01:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Query.Fields[x] = ftBlob, ich benötige aber ftByte

  Alt 2. Jun 2022, 15:21
Das Thema ist erledigt! Ja, es ging um TBytes.
Der Firedac Datenbanktreiber liest die Werte bei MSSQL nun korrekt aus. Bei einer Pervasive Datenbank (über ODBC) aber nicht. Wenn es in dem Feld eine Zeichenfolge für Textende gibt, bricht FireDac ab, obwohl FireDac das Feld als TBytes erkennt. Es kommt keine Fehlermeldung. Auch Pervasive selbst gibt im PCC nicht die Werte aus. Man kommt da anscheinend nur über native Btrieve dran. Ich probiere mal die original Hersteller PDAC‘s.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
599 Beiträge
 
Delphi XE6 Enterprise
 
#4

AW: Query.Fields[x] = ftBlob, ich benötige aber ftByte

  Alt 2. Jun 2022, 15:29
VarBinary(max) ist ein Blob-Feld. Siehe auch hier.

Zugriff dann eher mit LoadFromStream/SaveToStream statt AsBytes, würde ich sagen.
  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 13:13 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