Einzelnen Beitrag anzeigen

EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: TSQLConnection / Oracle / NSL_CHARACTERSET ändern

  Alt 6. Dez 2012, 22:33
oje, ich dachte das wäre so einfach wie in php
Ist es eigentlich auch, nur eben nicht mit der UnicodeIDE.

So, wie ich das sehe, brauchst du eine Komponente, mit welcher du den CharacterSet selber bestimmst und bei Bedarf sogar auf den nativen nicht-zu-UnicodeString(stimmt die XE-Compiler Angabe?), um dein Problem zu lösen.

Erst einmal würd ich sagen Finger weg von Ideen wie zu Laufzeit den CharacterSet ändern, wenn du eine UnicodeIDE benutzt:

Ich gehe mal davon aus, das die meisten Komponenten da gleich funktionieren: Stelle den vom Benutzer gewüschten CharacterSet ein, dann macht der Server(außer MsSQL) alle notwendigen Encodierungen und die DB-Zugriffs Komponente weiß, wie sie den vom Server erhaltenen Ansi-String(CP-WhatEver) zum UnicodeString mappt. Sollter der User den CharSet nicht angegeben haben, frage die DB danach und stelle die AnsiToUnicode und umgekehrt Functionen darauf ein, da ein Casten nur zufällig passende Resultate geliefert, wenn ServerCP <> DefaultCodePage. (auch ADO bleibt davon nicht verschont, tut es jedoch intern) Blablabla..

Wenn du den CharSet zur Laufzeit änderst, passt vielleicht der String, den du dir wünschst, jedoch ist es möglich, daß alle anderen Encodierungen totalen Stuß fabrizieren. (da die Componente noch immer den AnsiString mit CP-WhatEver erwartet)

Daher versuchs mal mit dem Vorschlag von jobo.

Wenn dann alles nix hilft:

Lade Zeos7-Beta herunter und installiere die Komponente.
Benutze die TZConnection anstadt oder zusätzlich zu der TSQLConnection (kenne ich nicht )

TZConnection.ClientCodePage := 'WE8MSWIN1252';
TZConnection.UserName etc.....

Verbinde dich mit der DB.
Delphi-Quellcode:
var
  ResultSet: IZResultSet;
  rs: RawByteString;
begin
  with ZConnection1.DbcConnection.PrepareStatement('select CryptedField from deine.tabelle') do
  begin
    ResultSet := ExecuteQueryPrepared;
    while ResultSet.Next do
      rs := ResultSet.GetBinaryStringByName('CryptedField'); //Ergebis ist der direkt von der DB gelieferten nicht encodierte String
    ResultSet.Close;
    ResultSet := nil;
    Close;
  end;
end;
Das funzt auf jeden Fall.
Kannst du damit etwas anfangen? Zeos läßt dem Benutzer in jeder hinsicht alle Freiheiten.

Gruß Michael

Geändert von EgonHugeist ( 6. Dez 2012 um 22:50 Uhr)
  Mit Zitat antworten Zitat