Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Inhalt Blobfield als Ansistring (https://www.delphipraxis.net/202812-inhalt-blobfield-als-ansistring.html)

dataspider 11. Dez 2019 07:29

Inhalt Blobfield als Ansistring
 
Hallo

Ich habe ein kleines Tool neu compiliert (bisher XE 6, jetzt 10.3.2).

Bisher halle ich folgenden Code:

Delphi-Quellcode:
procedure TfrmMain.ReadXMLData;
Var
  ABlobStream: TMemoryStream;
  AStream: TMemoryStream;
  Q: TMSQuery;
  ABlobField: TField;
  P: Integer;
begin
  Q := DMMain.qryXML;
  if Q.IsEmpty then
    Exit;
  ABlobField := Q.FindField('XML_AUSKUNFT');
  assert(ABlobField <> nil);
  if ABlobField.IsNull then
    Exit;
  ABlobStream := TMemoryStream.Create;
  AStream := TMemoryStream.Create;
  try
    ABlobStream := TMemoryStream(Q.CreateBlobStream(Q.FieldByName('XML_AUSKUNFT'), bmRead));
    {$IFDEF DEBUG}
      ABlobStream.Position := 0;
      ABlobStream.SaveToFile('d:\auskunft.xml');
    {$ENDIF}

    if ABlobStream.Size > 0  then
    begin
      p := GetStreamPos(ABlobStream, '>');
      AStream.WriteBuffer(SXMLHeader[1], Length(SXMLHeader));
      ABlobStream.Position := P;
      AStream.CopyFrom(ABlobStream, ABlobStream.Size - P);
    end;
    AStream.Position := 0;
    CR5XML.AssignFromStream(AStream);
  finally
    ABlobStream.Free;
    AStream.Free;
  end;
end;
In der mit XE 6 compilierten Version war der Inhalt in ABlobStream (XML) als Ansistring verfügbar.
Mit Rio liefert das nun UniCode.

Wie kann ich den Feldinhalt wieder als Ansistring bekommen?

Das Feld kommt aus den Devart SDAC Komponenten.

Frank

Klaus01 11. Dez 2019 07:46

AW: Inhalt Blobfield als Ansistring
 
Guten Morgen,

XE6 war doch auch schon UniCode.
Was spricht gegen UniCode - oder anders warum willst Du unbedingt AnsiString Daten?

Grüße
Klaus

dataspider 11. Dez 2019 07:52

AW: Inhalt Blobfield als Ansistring
 
Zitat:

Zitat von Klaus01 (Beitrag 1453225)
Guten Morgen,

XE6 war doch auch schon UniCode.
Was spricht gegen UniCode - oder anders warum willst Du unbedingt AnsiString Daten?

Grüße
Klaus


Ich muß noch etwas vorn anfügen, bevor ich es in ein TXMLDocument lade.
Ich müsste zu jetzt zu viel anpassen. Es ist ein simpler Import und der soll so schlell als möglich wieder laufen...

Frank

hoika 11. Dez 2019 07:57

AW: Inhalt Blobfield als Ansistring
 
Hallo,
UTF8Decode?

Klaus01 11. Dez 2019 08:15

AW: Inhalt Blobfield als Ansistring
 
.. ich finde nirgends wie SXMLHeader definiert ist?

Grüße
Klaus

mkinzler 11. Dez 2019 08:18

AW: Inhalt Blobfield als Ansistring
 
Welches Format(Kodierung) haben die Daten in der Tabelle?

dataspider 11. Dez 2019 08:40

AW: Inhalt Blobfield als Ansistring
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von mkinzler (Beitrag 1453229)
Welches Format(Kodierung) haben die Daten in der Tabelle?

Das Feld ist ein nvarchar.
Wenn ich blobfield.SaverToFile aufrufe, erhalte ich Daten wie im Anhang.
Also jeder Zeichen hat jetzt noch ein 00 bekommen und das muss weg.

Der Feldinhalt kann sehr groß sein, da es auch eine PDF in Base64 enthält.


Frank

Klaus01 11. Dez 2019 10:38

AW: Inhalt Blobfield als Ansistring
 
.. welches RDBMS wird verwendet?

Zitat:

Geht einer Zeichenfolgenkonstante der Buchstabe „N“ voraus, gibt die implizite Konvertierung eine UCS-2- oder UTF-16-Zeichenfolge zurück, wenn die Konstante, die konvertiert werden soll, die maximale Länge für den Datentyp für „nvarchar“-Zeichenfolgen (4.000) nicht überschreitet. Andernfalls hat die implizite Konvertierung einen hohen „nvarchar(max)“-Wert zur Folge.
Von hier: SQL Server

Grüße
Klaus

dataspider 11. Dez 2019 12:49

AW: Inhalt Blobfield als Ansistring
 
Zitat:

Zitat von Klaus01 (Beitrag 1453245)
.. welches RDBMS wird verwendet?

Zitat:

Geht einer Zeichenfolgenkonstante der Buchstabe „N“ voraus, gibt die implizite Konvertierung eine UCS-2- oder UTF-16-Zeichenfolge zurück, wenn die Konstante, die konvertiert werden soll, die maximale Länge für den Datentyp für „nvarchar“-Zeichenfolgen (4.000) nicht überschreitet. Andernfalls hat die implizite Konvertierung einen hohen „nvarchar(max)“-Wert zur Folge.
Von hier: SQL Server

Grüße
Klaus

Danke

Datenbank ist MS-SQL

Ich habe - damit es erst mal weiter geht - jades 2. Zeichen im Stream gelöscht.
Damit funktioniert es erst mal.
Ich versuche jetzt noch, die Devart SDAC Komponenten dazu zu bringen, den Inhalt des Feldes nicht als Unicode zu liefern.
Aber UseUnicode wie in IBDac gibt es bei SDac leider nicht.

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf