Entwickler-Ecke

Datenbanken - Charset von dbase-Datenbanken ändern


kiwicht - Mi 18.12.02 13:03
Titel: Charset von dbase-Datenbanken ändern
Hi,

weiß einer wie ich zur Laufzeit den Charset von DB´s ändern kann?

Das Problem ist, das ich in allen möglichen Kontroll-Feldern, die auf die DB zugreifen, die Umlaute angezeigt bekomme. die die DB enthält. Aber intern werden die Umlaute immer noch nicht erkannt, und als z.B. ,"´ Gänsefüßchen dargestellt. Das macht sich dann bemerkbar, wenn ich mittels SQL in den Feldern nach "Ö" suche, und ich kein Feld angezeigt bekomme, obwohl es definitv Felder geben müsste.

Bei den z.B. Edit-Feldern setzt ich ja einfach unter "Fonts" die "charset"-eigenschaft auf "OEM", aber was mache ich bei der DB-Quelle? Muss ich das vielleicht irgendwo in der SQL-Anweisung festlegen?

danke im Voraus für hoffentlich eine Lösung, bin echt am verzweifeln hier...

kiwicht


LCS - Mi 18.12.02 13:22

Hi
ne Funktion um den Zeichensatz zur Laufzeit zu ändern gibts IMHO nicht. Ich hatte vor längerer Zeit ein ähnliches Problem und die enizige Lösung die was gebracht hat, war die Tabelle in eine neue, mit dem richtigen Zeichensatz zu schreiben.

Als Alternative könntest du noch versuchen den SQL-String vor dem Absenden zu konvertieren. Entweder mit der API-funktion CharToOEM oder noch besser mit der BDE-Funktion dbiAnsiToNative.

Gruss Lothar


kiwicht - Mi 18.12.02 15:00

also in eine neue db schreiben fällt leider aus, da von der db noch zig andere programme abhängen, und die will ich nicht alle portieren.

aber das mit den funktion werd ich ma probieren,

danke
kiwicht


kiwicht - Do 19.12.02 09:50

... ich habs jetzt mal mit dem AnsiToNative versucht, aber ich bin einfach zu lame die Funktion richtig einzusetzen:

Laut Delphi-Hilfe:

AnsiToNative(Locale: TLocale; const AnsiStr: string; NativeStr: PChar; MaxLen: Integer): PChar;

1. Wofür bitte steht Locale?
2. AnsiStr -> der String aus meinem EditFeld zur Konvertierung !?
3. NativeStr -> PChar, der konvertierte AnsiStr, aber kann ich mit PChar
auch SQL-Abfragen durchführen !?
4. MaxLen -> Wie lange darf der String max sein

und meine Ausführunge, die btw nichts funzt...

conveingabe := AnsiToNative(eingabe;25);

gut, das das NICHT funzen kann, is mir irgendwo schon klar, aber warum?

könnt ihr einem absoluten delphi-nub bitte weiterhelfen? thx im voraus, im gegenzug könnt ihr mir auch n paar flash-fragen stellen..... ;)

kiwicht


LCS - Do 19.12.02 10:14

Hi
das ist das betreffende Beispiel aus der BDE-Reference: Kapselt den Aufruf in einer Funktion.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function fDbiAnsiToNative(Table: TTable; AnsiStr: String): String;
var
  pDesc: pLDDesc;
  Len: Word;
  Done: Boolean;
begin
  Len := Length(AnsiStr);
  SetLength(Result, Len);
  Check(DbiGetLDObj(Table.Handle, pointer(pDesc)));
  Check(DbiAnsiToNative(pointer(pDesc), PChar(Result), PChar(AnsiStr), Len, Done));
end;


Gruss Lothar


hansa - Do 19.12.02 14:19

Hi,

vielleicht gehts besser mit meiner Holzhammer-Methode :


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function IBMAsciiToAnsi(s: string): string;
var
  result : string;
  i: integer;
begin
  Result := '';
  for i := 1 to Length(s) do
  begin
    case s[i] of
      #142: Result := Result + #196; {ä}
      #153: Result := Result + #214; {ö}
      #154: Result := Result + #220; {ü}
      #132: Result := Result + #228; {Ä;}
      #148: Result := Result + #246; {Ö}
      #129: Result := Result + #252; {Ü}
      #225: Result := Result + #223; {ß}
    else
      Result := Result + s[i];
    end;
  end;
  IBMAsciiToAnsi := result;
end;


ausländische Umlaute sind aber NICHT berücksichtigt !

Gruß
Hansa


kiwicht - Do 19.12.02 15:48

Cool, die von Hansa, die versteh sogar ich... seih mir nit böse LCS, aber bei deiner seh ich überhaupt nit durch... delphi-newby eben.. ;)

danke trotzdem, das hilft mir schon mal sehr viel weiter!

mfg
kiwicht


kiwicht - Mi 15.01.03 15:22

NAAAAAACHTRAG ...... ;)

Leider half die Holzhammer-Methode von Hansa auch nicht viel weiter... und ich hab mich nochmal eingehend mit dem Problem beschäftigt.

Die Lösung:

Der Text aus dem Edit-Feld DARF NICHT mit UpperCase in GroßBuchstaben umgewandelt werden, da diese Funktion nur die 7-bittigen Zeichen, also alles von a-z., berücksichtigt. Darunter fallen aber keine Umlaute.

Benutzt man AnsiUpperCase, werden aber auch diese Umgewandelt, und die Suche nach Umlauten wie Ö´s und Ü´s funktioniert einwandfrei!

Wollt ich nur mal gesacht haben, damit sich nachfolgende Generationen nicht auch an diesem Problem die Zähne ausbeissen... :P ... und damit der nächste per Suchfunktion eine vernünftige Lösung findet...

Danke nochaml für eure Hilfe und die wertvollen Tips...

mfg
kiwicht