Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi unicode_fss-konvertierung (https://www.delphipraxis.net/71705-unicode_fss-konvertierung.html)

sancho1980 19. Jun 2006 19:38

Datenbank: firebird 1.5 • Zugriff über: ibx, ibexpert

unicode_fss-konvertierung
 
hallo,

ich habe folgendes problem:

ich lese daten mit tstringfield - komponenten aus einer paradox-tabelle und will diese in einer firebird-datenbank speichern.

die char-felder in der paradox-tabelle sind 1-byte-chars, die in der firebird-tabelle sind in unicode_fss.

habe zuerst probiert, für die firebird-tabelle twidestringfield - komponenten zu nehmen.
das geht aber nicht, da firebird scheinbar die felder selbst als 1-byte-chars versendet (scheinbar spaltet der die 2-byte-zeichen auf)..jedenfalls bekomm ich immer eine exception, schon wenn ich nur die firebird-datenbank öffne, dass das feld vom typ string ist, aber widestring erwartet wird.

wenn ich stattdessen tibstringfield - komponenten verwende, klappt zwar das übertragen der daten von der einen tabelle in die andere, aber umlaute und sonderzeichen werden falsch 'konvertiert'

zumindest bei einem bloßen:

Delphi-Quellcode:
var
  ibsf: TIBStringField;
  sf: TStringField;
 
  ibsf.AsString := sf.AsString;
Wie bekomme ich es hin, dass der in ibsf das widestring-äquivalent von sf speichert?
wenn firebird diesen unicode_fss - zeichensatz hat, muss es doch auch möglich sein, da widestrings zu speichern, oder?

danke,

martin

mkinzler 19. Jun 2006 20:02

Re: unicode_fss-konvertierung
 
IBX ist nicht wirklich unicode-fähig.
Aber versuch mal
Delphi-Quellcode:
Table.FieldByName(<filedname>).AsWideString
Aber wahrscheinlich mußt du wohl auf andere Komponenten umsteigen.

sancho1980 19. Jun 2006 20:12

Re: unicode_fss-konvertierung
 
Zitat:

Zitat von mkinzler
IBX ist nicht wirklich unicode-fähig.
Aber versuch mal
Delphi-Quellcode:
Table.FieldByName(<filedname>).AsWideString
Aber wahrscheinlich mußt du wohl auf andere Komponenten umsteigen.


ja die eigenschaft gibt es leider nicht :-(

weißt du von irgendwelchen komponenten, mit denen ich das 100% gebacken krieg?

danke,

martin

mkinzler 19. Jun 2006 20:15

Re: unicode_fss-konvertierung
 
Also bei Zeos gibte es diese Eigenchaft. Wenn du mir ne datenbank mit daten schickst kann ich es Testen.

Funktionieren müßte es auch mit IBObjects, fibplus, IBDac.

sancho1980 19. Jun 2006 20:26

Re: unicode_fss-konvertierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
klar

hier ist so ne datenbank

bei den feldern kannst du dir ja unter vielen paar aussuchen, asterm, zster, etc...alles strings

danke,

martin

ps: fib-plus hab ich auch installiert, aber davon versteh ich nix

und zeos hatte ich bei mir nie installiert bekommen; hatte es irgendwann aufgegeben...

..wenns klappt sag mir bitte auch wie du's anstellst!

mkinzler 19. Jun 2006 20:38

Re: unicode_fss-konvertierung
 
Hallo Martin, könntest du mir die weiteren Teile der Paradox-tabelle noch nachliefern?

sancho1980 20. Jun 2006 02:32

Re: unicode_fss-konvertierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
oh ja, sorry, da gehört ja noch mehr dazu...
danke,
martin

mkinzler 20. Jun 2006 06:24

Re: unicode_fss-konvertierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mit Zeos gehts

mikhal 20. Jun 2006 07:29

Re: unicode_fss-konvertierung
 
Die Zugriffskomponenten IBDAC von CoreLabs unterstützen Unicode.

Grüße
Mikhal

sancho1980 21. Jun 2006 16:16

Re: unicode_fss-konvertierung
 
hey,
ihr kennt euch doch bestimmt mit sowas aus:
habe rausgefunden, dass ich die umwandlung auch mit den ibx-komponenten hinbekomme, vorausgesetzt ich wandle die strings vor speicherung in widestrings um; eine passende funktion dafür hab ich schon gefunden:

Delphi-Quellcode:
{:Converts Ansi string to Unicode string using specified code page.
  @param  s       Ansi string.
  @param  codePage Code page to be used in conversion.
  @returns Converted wide string.
}
function StringToWideString(const s: AnsiString; codePage: Word): WideString;
var
  l: integer;
begin
  if s = '' then
    Result := ''
  else
  begin
    l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0);
    SetLength(Result, l - 1);
    if l > 1 then
      MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
        - 1, PWideChar(@Result[1]), l - 1);
  end;
end; { StringToWideString }
Mein Problem ist folgendes: ich muss der funktion ja eine codepage in form eines numerischne werts übergeben und ich find leider nicht wo steht, welcher wert welcher codepage entspricht...hab durch ausprobieren schon mal rausgefunden, dass der wert für win1252 = 1 ist aber wie ist er bei anderen codepages...irgendwo muss das doch dokumentiert sein...
danke,

martin


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

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