Anbindung von iSeries (sprich AS/400) an SQLServer2005

Dieser Artikel beschäftigt sich mit der Anbindung von iSeries-Systemen an den SQL Server 2005. IBM liefert entsprechende Client-Software, so dass diese sowohl über OLE-DB, als auch über ODBC erfolgen kann. Vorweg noch ein paar Worte zur Historie: Im Jahre 2000 wurde die AS/400 in iSeries umbenannt, im Oktober 2003 wurde der Name iSeries i5 geprägt, und seit 2006 gibt es die Modelle IBM System i5. Der neueste Name seit 2007 ist System i. Der alte Name hält sich aber hartnäckig und wird noch oft verwendet. In diesem Artikel verwende ich die Bezeichnung iSeries, da auch die Client-Software den Namen iSeries-Navigator trägt.

Installation

Diese Dokumentation beschreibt die Verwendung der IBM-Software, die zur Anbindung der Clients geliefert wird. Auch wenn die neuesten Treiber die besten Ergebnisse erzielen, werden wohl immer nur die Treiber offiziell unterstützt, deren Version mit der aktuellen Version der iSeries-Software übereinstimmt. Bei der Installation des iSeries-Treibers auf dem Server wird die Option "Datenübertragung" ausgewählt. Hier werden dann keine überflüssigen Elemente installiert, die auf dem Server nicht benötigt werden.

SSIS Anbindung

SSIS über OLE-DB

Für die Anbindung muss man zuerst eine neue OLE-DB Verbindung einrichten. Als Teiber wählt man "OLE DB systemeigen\IBM DB2 UDB for iSeries OLE DB Provider":


Über den Button "Datenverknüpfungen" kommt man zu folgender Maske, die erst mal keine weiteren Informationen bietet. Interessanter wird es dann in der Lasche "Alle".

Die Angabe für "Ursprünglicher Katalog" oder "Anfangskatalog" kann leer bleiben, wenn es nur eine Datenbank auf der iSeries gibt. Mit WRKRDBDIRE (WoRK Remote DataBase DIRectory Entry) können auf der iSeries die dort eingetragenen relationalen Datenbanken angezeigt werden. Die eigene Datenbank sollte dort unter "Ferner Standort" als *LOCAL definiert sein. In der Regel wird man den Systemnamen als Namen der Datenbank verwenden. Dieser Name darf auch als Anfangskatalog verwendet werden. Man darf hier aber auf keinen Fall den Namen einer Bibliothek (Library) auf der iSeries eintragen, da man ansonsten folgende Fehlermeldung erhält:
CWBZZ5024 Die Eigenschaft für den Anfangskatalog wurde auf einen ungültigen Katalog gesetzt.

Die Standardbibliothek wird in der Lasche "Alle" über die folgende Eigenschaft definiert:

Bei der Verwendung dieser Verbindung erhält man wahrscheinlich die Meldung, dass die Code-Page Informationen von diesem OLE-DB Anbieter nicht abgerufen werden können. Schaut man sich die Eigenschaften der Datenflusskomponente an, so finden sich dort die Angaben zu "AlwaysUseDefaultCodePage" und "DefaultCodePage". Setzt man denn ersten der beiden Werte auf "True", so wird die Warnung unterdrückt, der zweite Wert steht in der Regel schon auf 1252 und wird in dem Fall verwendet, wenn die CodePage-Informationen nicht abgerufen werden können. Hiermit wird man in der Regel problemlos mit den Daten arbeiten können.

SSIS über ODBC

Für die Anbindung muss man zuerst eine neue ADO.NET-Verbindung einrichten. Als Anbieter wählt man ".NET Anbieter\Odbc Dara Provider". Für die Datenquellenspezifikation kann man eine vorhandene Datenquelle verwenden, wobei zu beachten ist, dass diese nicht nur zur Entwicklung auf dem Client, sondern auch auf dem Server vorhanden sein muss, wenn das Paket durch den SQLServerAgent ausgeführt wird. Alternativ kann die Verbindungszeichenfolge generiert werden, indem eine vorhandene ODBC-Quelle ausgewählt wird.

Die Standard-Bibliothek ergibt sich dann aus der ODBC-Quelle oder aus der Angabe "dbq=Standard-Bibliothek;" in der Verbindungszeichenfolge.

Im SSIS-Paket ist als Datenquelle ein DataReader-Objekt auszuwählen. Im Connection-Manager trägt man dann den Namen des Verbindungsmanagers ein. Bei den Eigenschaften (Properties) wird das SQL hinterlegt.

Bei der Anbindung über ODBC werden unter Umständen die Zeichenfelder als Unicode gemeldet und müssen noch auf nicht unicode konvertiert werden.

LinkedServer Anbindung

Grundsätzlich sollte die Option "InProcess zulassen" (Allow inprocess) des Anbieters IBMDASQL bzw. IBMDA400 gesetzt sein. Hierüber kann der Austausch der Sicherheitsinformationen zwischen dem SQLServer und dem Treiber erfolgen. Andernfalls erhält man diese Meldung:
Meldung 7399, Ebene 16, Status 1, Zeile 14
The OLE DB provider "IBMDA400" for linked server "iSeries_OLE" reported an error. Access denied.
Meldung 7350, Ebene 16, Status 2, Zeile 14
Cannot get the column information from OLE DB provider "IBMDA400" for linked server "iSeries_OLE".

In den folgenden Beispielen wurde dann der Treiber IBMDASQL verwendet.

LinkedServer über OLE-DB

Die Einrichtung eines Verbindungsserver ist nicht kompliziert, wenn man die Besonderheiten der iSeries beachtet.

EXEC master.dbo.sp_addlinkedserver @server = N'iSeries', @srvproduct=N'DB2400 UDB for iSeries', @provider=N'IBMDASQL', @datasrc=N'iSeries-Systemname', @catalog=N'Datenbank-Name', @provstr='Default Collection=iSeries-Library;'

Auch hier gilt wieder, @catalog ist der Name der Datenbank, nicht der Name der Standardbibliothek. In der Regel kann diese Angabe auch hier entfallen. Die Standardbibliothek teilt man dem Treiber über den Provider-String (@provstr) mit.
Mit der Einstellung der "Default Collection" werden auch im Management Studio die Informationen über diese Bibliothek angezeigt. Andernfalls kommt zwar keine Fehlermeldung, aber der Verzeichnisbaum bleibt leer.

LinkedServer über ODBC

Die Einrichtung eines Verbindungsserver über ODBC ist ebenfalls nicht besonders kompliziert.

EXEC master.dbo.sp_addlinkedserver @server = N'iSeries_ODBC', @srvproduct=N'DB2400 UDB for iSeries', @provider=N'MSDASQL', @datasrc=N'iSeries-DSN-Name', @catalog=N'Datenbank-Name', @provstr='dbq=iSeries-Library;'

Die Angabe des catalog scheint nicht berücksichtigt zu werden und kann entfallen. Die Standard-Bibliothek wird über den Provider-String definiert, andernfalls kommt sie aus den Einstellungen der ODBC-Quelle.

Performance

Der Vergleich der Performance erfolgt hier nur in Prozentangaben, da diese Information nur bedingt auf andere Systeme übertragbar ist. Gemessen wurde der Transfer einer Tabelle mit 200.000 Sätzen, die vorab über Truncate geleert wurde.

Art der Anbindung Dauer der Übertragung
SSIS mit OLE-DB 100 %
SSIS mit ODBC 762 %
LinkedServer mit OLE-DB 180 %
LinkedServer mit ODBC 168 %

Während insgesamt die Anbindung per SSIS mit OLE-DB unschlagbar ist, ist die Anbindung per LinkedServer über ODBC günstiger als über OLE-DB. Die Ursache für die langsame Anbindung im SSIS mit ODBC könnte in der unnötigen Konvertierung zwischen Unicode und Nicht-Unicode Zeichen liegen.