Anmelden

View Full Version : Verbindungsserver auf einer MS-SQL-Datenbank zur AS400



barny68
26-05-17, 09:49
Hallo Zusammen,

ich suche seit einiger Zeit im Netz eine Möglichkeit, Daten einer iSeries-Datenbank vom MS-SQL-Server (2012 Service Pack 3) mittels eines Verbindungsservers upzudaten bzw. einzufügen. Habe diverse Provider probiert, aber ein schreibender Zugriff funktioniert einfach nicht. Ein lesender Zugriff funktioniert bei allen Providern wunderbar. Ich hoffe Ihr könnt mir helfen.

Auf dem SQL-Server ist "IBM i Access für Windows Version 7.1.0.SI57907" installiert

Ich habe folgende Provider probiert:
IBMDA400 (IBM DB2 for i IBMDA400 OLE DB Provider)
IBMDASQL (IBM DB2 for i IBMDASQL OLE DB Provider)
MSDASQL (Microsoft OLE DB Provider for ODBC Drivers)

--> bei allen Providern ist "Allow in Process" aktiviert
--> bei der ODBC-Verbindung ist "Sofortiges COMMIT" bzw. "COMMIT=*NONE" aktiviert

Ein schreibender Zugriff über die gleiche ODBC-Verbindung mittels MS-ACCESS oder PHP funktioniert auch, aber nicht mittels des SQL-Servers.

Einige Fehlermeldungen:

Meldung 7390, Ebene 16, Status 2, Zeile 1
Der angeforderte Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter 'IBMDA400' für den Verbindungsserver 'IBMDA400' die angeforderte Transaktionsschnittstelle nicht unterstützt.


Meldung 7391, Ebene 16, Status 2, Zeile 1
Der Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter 'IBMDASQL' für den Verbindungsserver 'IBMDASQL' keine verteilte Transaktion beginnen konnte.


Der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'MSDASQL' hat die Meldung '[IBM][System i Access ODBC-Treiber]Enlist bei DTC-Phase fehlgeschlagen. 2' zurückgeben.
Meldung 7391, Ebene 16, Status 2, Zeile 1
Der Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'MSDASQL' keine verteilte Transaktion beginnen konnte.


Habt ihr eine Idee voran es liegen kann. Ich bin über jede Antwort dankbar!

Vielen Dank im voraus!


Gruß Bernd

BenderD
26-05-17, 10:02
Hallo Zusammen,

ich suche seit einiger Zeit im Netz eine Möglichkeit, Daten einer iSeries-Datenbank vom MS-SQL-Server (2012 Service Pack 3) mittels eines Verbindungsservers upzudaten bzw. einzufügen. Habe diverse Provider probiert, aber ein schreibender Zugriff funktioniert einfach nicht. Ein lesender Zugriff funktioniert bei allen Providern wunderbar. Ich hoffe Ihr könnt mir helfen.

Auf dem SQL-Server ist "IBM i Access für Windows Version 7.1.0.SI57907" installiert

Ich habe folgende Provider probiert:
IBMDA400 (IBM DB2 for i IBMDA400 OLE DB Provider)
IBMDASQL (IBM DB2 for i IBMDASQL OLE DB Provider)
MSDASQL (Microsoft OLE DB Provider for ODBC Drivers)

--> bei allen Providern ist "Allow in Process" aktiviert
--> bei der ODBC-Verbindung ist "Sofortiges COMMIT" bzw. "COMMIT=*NONE" aktiviert

Ein schreibender Zugriff über die gleiche ODBC-Verbindung mittels MS-ACCESS oder PHP funktioniert auch, aber nicht mittels des SQL-Servers.

Einige Fehlermeldungen:

Meldung 7390, Ebene 16, Status 2, Zeile 1
Der angeforderte Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter 'IBMDA400' für den Verbindungsserver 'IBMDA400' die angeforderte Transaktionsschnittstelle nicht unterstützt.


Meldung 7391, Ebene 16, Status 2, Zeile 1
Der Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter 'IBMDASQL' für den Verbindungsserver 'IBMDASQL' keine verteilte Transaktion beginnen konnte.


Der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'MSDASQL' hat die Meldung '[IBM][System i Access ODBC-Treiber]Enlist bei DTC-Phase fehlgeschlagen. 2' zurückgeben.
Meldung 7391, Ebene 16, Status 2, Zeile 1
Der Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'MSDASQL' keine verteilte Transaktion beginnen konnte.


Habt ihr eine Idee voran es liegen kann. Ich bin über jede Antwort dankbar!

Vielen Dank im voraus!


Gruß Bernd

... die Fehlermeldung sagt doch, was für ein Problem besteht: Transaktionskontrolle (Commit) nicht unterstützt => da fehlt es an Journalisierung der Daten auf der AS/400 (STRJRNPF). Ob sich das Transaktionsverhalten im Verbindungsserver abschalten lässt (wovon ich entschieden abraten würde)
entzieht sich meiner Kenntnis, da ich die Transaktionen von der AS/400 aus durchführe.

D*B

Fuerchau
26-05-17, 10:17
Beim Lesen ist das dem SQL-Server natürlich egal, aber beim Schreiben verlangt der SQL-Server vernünftiger weise Transaktionskontrolle. Dies lässt sich nicht abschalten.
Voraussetzungen also:
- Journalisierung auf der AS/400 für die betroffenen Dateien
- Commit *CHG in der Verbindungseinstellung
Dann klappts auch mit dem Schreiben.
Auch wenn die Standard-Anwendung Transaktionen nicht unterstützt kann man trotzdem journalisieren und ggf. den Wechsel der Journalempfänger mit Cleanup vollständig dem System überlassen.
Außerhalb des SQL-Servers mit eigenen Scripten/Programmen kann man Transaktionen ja selber steuern.

Fuerchau
26-05-17, 10:23
Ggf. kannst du dies hier abschalten:
https://technet.microsoft.com/en-us/library/ms186839(v=sql.105).aspx
Allerdings scheint dies nur beim Aufruf von Prozeduren zu gelten.
Du müsstest dann also für deine Writes/Inserts/Deletes entsprechende Prozeduren auf der AS/400 schreiben und aufrufen.
Dies ist aber schon unsicher, da ja die Daten ggf. auf der AS/400 geschrieben sind, aber der SQL-Server ggf. die Transaktion zurückdreht.
Gerade bei verteilten Transaktionen ist Journalisierung auf der AS/400 lebenswichtig.

barny68
29-05-17, 08:14
Die Tabelle ist jetzt journalisiert. Der Update eines Datensatzes dauert allerdings je nach Provider bis zu 1 min, ein Insert, egal von welchem Provider, musste ich jeweils nach 10 min abbrechen.

Habt ihr noch eine Idee?
Vielen Dank u. Gruß
Bernd

Fuerchau
29-05-17, 08:22
Ein Update dauert dann 1 Minute (mit nachfolgendem Abbruch), wenn der Datensatz durch konkurierende Updates gesperrt ist!
D.h., dass deine Transaktionssteuerung nicht funktioniert.
Je nach deiner Methode musst du vor dem Update eine "Start Transaction" und wenn du fertig bist, einen "Commit Transaction" durchführen. Im Fehlerfall heißt das ggf. "Rollback Transaction".
Wenn du eine Transaktion so "hängen" lässt, sperrt das nicht nur deine Transaktionen sondern auch die der anderen Prozesse incl. der AS/400-Software.
Zusätzlich kann es auch vorkommen, dass durch Verbindungspooling jedes mal eine neue Verbindung aufgemacht wird, weil die vorherigen Transaktion nicht abgeschlossen wurde. Somit sperrst du dich selber vor weiteren Updates.

Ein Insert hat keine Wartezeit, hier hast du ein anderes Problem!