PDA

View Full Version : DBCS über ODBC/Linked Server SQL 2008 abrufen



hs
20-10-15, 19:49
Hallo,

muss von unserer AS400 über ODBC chin. Zeichen abrufen. Diese sind in einer Tabelle gespeichert mit CCSID 1388.

Ich habe mit der ODBC-Verbindung auf einem SQL Server 2008 einen liked server erstellt.

Select auf diese tabelle liefert mir aber nur Kauderwelsch. Ich verwende für die Verbindung zur AS400 einen User, der ebenfalls CCSID 1388 hat.

Kann man da in der ODBC-Verbindung was einstellen?

Danke
HS

Fuerchau
21-10-15, 07:34
Ich denke, du verwendest CCSID 13488. Diese ist aber bei einem User nicht einstellbar.
Welche CCSID hast du im System (QCCSID) hinterlegt?
Ggf. nimmt hier der QZDA-Job was anderes und schafft die Unicode-Verwendung nicht.

Nun kann es bei ODBC noch einen anderen Grund geben.
Für ODBC wird auf Grund ADO der default OLEDB-Treiber von Microsoft verwendet.
Dieser meldet sich beim ODBC-Treiber noch als ODBC 2.x-Anwendung an.
Hierbei geht der CA-Treiber nun leider davon aus, dass der Client nicht Unicodefähig ist.
Alle Zeichenvariablen werden daher als VARCHAR an stelle von VARWCHAR übergeben.

Hier kann nur der OLEDB-Treiber IBMDASQL weiterhelfen da dieser tatsächlich Unicodefähig ist.
Leider musst du dazu den Verbindungsserver löschen und einen neuen Verbindungsserver als OLEDB eintragen.

hs
21-10-15, 08:05
Hallo,
vielen dank für die Info.
Die CCSID des Users ist 1388 - diese steht im USRPRF (Parameter heißt auch CCSID). Die Tabelle (sehe ich mit DSPFD) hat auch CCSID 1388. Dort stehen in einem Feld DBCS-Daten (Artikelbezeichnung).

Wenn ich in Excel-VBA mittels ODBC-Treiber ein select oder update auf diese Tabelle mache, funktioniert es mit diesem User. Mit einem anderen User, der eine andere CCSID hat, geht es nicht.

Jedoch liefert mir der linked Server ein falsches Ergebnis.
Ich habe diesen jetzt mal neu erstellen wollen mit IBMDASQL, bekomme aber folgende Fehlermeldung:
(Habe alles wie zuvor gemacht nur den Provider geändert)

Der Verbindungsserver wurde aktualisiert, der Verbindungstest für ihn ist aber fehlerhaft. Möchten Sie die Eigenschaften des Verbindungsservers bearbeiten?

Das Datenquellenobjekt des OLE DB-Anbieters 'IBMDASQL' für den Verbindungsserver 'TEST_CCSID_1388' kann nicht initialisiert werden.
Der OLE DB-Anbieter 'IBMDASQL' für den Verbindungsserver 'TEST_CCSID_1388' hat die Meldung 'CWBCO1004 - Auflösung der fernen Adresse nicht möglich ' zurückgeben. (Microsoft SQL Server, Fehler: 7303)

hs
21-10-15, 08:17
Nachtrag:

Der linked Server klappt jetzt und das Ergebnis sieht jetzt anders aus, aber immer noch nicht korrekt.

Beispiel einer Bezeichnung:
Vorher: *&($! 35 - 37mm
Jetzt: ???? 35 - 37mm

Fuerchau
21-10-15, 10:16
OK, ich habe das Stichwort DBCS nicht korrekt interpretiert.
CCSID 1388 ist eine native AS/400-CCSID und kann tatsächlich nur dort verwendet werden.
Für ODBC benötigst du eine Übersetzung in Unicode, das ist eben CCSID 13488.
Die erreichst du am besten mit einer SQL-View, in der du alle diese Zeichenfelder per "cast(xx vargraphic(nn) ccsid 13488" oder "cast(xx nvarchar(nn))" umwandelst.
Schwierig wird's dann nur bei Where-Klauseln, die dann auf diese Felder gehen.
Da hilft dann ggf. ein "calculated Index".

hs
21-10-15, 11:11
Vielen herzlichen Dank. Es funktioniert jetzt wie folgt:

exec ('Select Artikel, cast(bezeichnung as nvarchar(50)) as bez FROM mybib.maytab''') AT MY_LINKED_SERVER