PDA

View Full Version : IBMDA400 OLEDB



Seiten : 1 [2] 3

rst
11-06-04, 14:25
Ich selber habe das Programm in der qsys überprüft und dann
prompt aus Ihren Vorschlag die falsche schreibweise übernommen.

Um das Ganze zu Testen habe ich es jetzt auf der AS400 probiert!!

folgender Befehl:

CALL QSYS/QCMDEXC('ADDLIBLE LIB(LIB1)',0000000018.00000)

Fehlernachricht:

Nachricht . . . : Zeichen im Qualifikationsmerkmalsanfang 'QCMDEXC('A'
ungültig.
Ursache . . . . . : Das Qualifikationsmerkmal muß aus einer gültigen
Zeichenfolge, einem numerischen oder vordefinierten Wert bestehen.

aus dem Jobprotokoll:
Bibliothek QSYS2929 nicht gefunden.
Client-Anforderung - Ausführen des Befehls 'CALL
'.
Zeichen im Qualifikationsmerkmalsanfang 'QCMDEXC('A' ungültig.
Fehler in Befehl *N gefunden.
Im Befehl ist ein Fehler aufgetreten.

mk
11-06-04, 14:50
Hallo ,

mit dem VB kenne ich mich nicht aus
aber hier die Syntax des qcmdexc von einer Befehlszeile
CALL QSYS/QCMDEXC PARM('ADDLIBLE LIB(MK)' 0000000018,00000)

Wichtig ist eigentlich das Schlüsselwort Parm

und einen Leerstelle zwischen dem ersten und zweiten Parameter.

gruss Michael

Fuerchau
11-06-04, 15:40
Wenn du das über STRSQL direkt auf der AS/400 ausprobierst:
"CALL QSYS/QCMDEXC('ADDLIBLE LIB(LIB1)', 0000000018.00000)"
"CALL QSYS/QCMDEXC('ADDLIBLE LIB(LIB1)', 0000000018,00000)"

funktionieren beide ! (Decimal-Komma oder -Punkt sind egal)
Wichtig ist, dass die Parameter durch KOMMA UND LEERZEICHEN getrennt werden.

Über IBMDA400 gilt:
"{{CALL QSYS.QCMDEXC('ADDLIBLE LIB(LIB1)', 0000000018.00000)}}"
Aufrufkonventionen SQL statt SYSTEM (d.h., Qualifizierung mit Punkt statt Schrägstrich).

Ich hatte allerdings auch diverse Schwierigkeiten und habe deshalb eine Prozedur erstellt, die ich dann direkt per CALL (ohne geschweifte Klammern) aufrufen konnte.
Ausserdem verwende ich nicht IBMDA400 sondern den ODBC-Treiber von CA, der ist einfach besser als IBMDA400.

Sven Schneider
11-06-04, 19:18
Also ich hab das mal getestet :

Wenn ein Command wie QCMDEXC über das ADODB.Command Objekt aufgerufen wird, sind folgende Hostserver im Zugriff.

1. Remote-Command Server QZRCSRVS, wenn
.CommandText = "{{CALL QSYS/QCMDEXC PARM('ADDLIBLE LIB(LIBRARY1)' 0000000022.00000)}}"
oder
.CommandText ={{CALL /QSYS.LIB/QCMDEXC.PGM('ADDLIBLE LIB(LIBRARY1)' 0000000022.00000)}}

2. Database Server QZDASOINIT, wenn
.CommandText = "{CALL QSYS.QCMDEXC('ADDLIBLE LIB(LIBRARY1)', 0000000022.00000)}"
oder
.CommandText = "CALL QSYS.QCMDEXC('ADDLIBLE LIB(LIBRARY1)', 0000000022.00000)"

Da der ADDLIBLE ja im QZDASOINIT erfolgen soll, damit die Triggerprogramme gefunden werden, ist in den Beispielen eine {..} zu viel.
Zwei geschweifte Klammern rufen immer den Remote-Command Server, weile der CommandText dann von IBMDA400 als Command interpretiert wird und nicht als SQL-String !!!.

Hab das eben auch in der technischen Doku zu OLE DB für IBMDA400 gefunden (ist bei iSeries access als Windows-Hilfe Dokument cwbzmtch.hlp dabei):

"Einfache geschweifte Klammern geben an, dass eine gespeicherte SQL-Prozedur aufgerufen werden soll. Doppelte geschweifte Klammern geben an, dass ein iSeries-Programm aufgerufen werden soll."


Sven.

Fuerchau
12-06-04, 16:33
Dabei ist natürlich darauf zu achten, dass die Prozedur auch definiert ist (siehe meine Beispiele in obigem Link zu CREATE PROCEDURE).

Sven Schneider
16-06-04, 12:51
Dabei ist natürlich darauf zu achten, dass die Prozedur auch definiert ist (siehe meine Beispiele in obigem Link zu CREATE PROCEDURE).

Sorry Baldur, dem muss ich wiedersprechen.
Externe Prozeduren müssen nicht registriert sein, SQL-Prozeduren werden automatisch erstellt (C-PGM-Objekt) und registriert. DB2 kann externe Prozeduren trotzdem per SQL-Call aufrufen.

Einen Nachteil hat das aber schon. Als Entwickler kann ich dann nicht auf die Parameter (z.B. .parameters(1)) zugreifen, d.h. ich muss die Parameter immer im Call direkt und im richtigen Format füllen. Ein prepared SQL-Call geht damit nicht.

Deswegen funktionieren die oben angegebenen SQL-CALLs auch. (ADDLIBLE)

Und wenn ich das ganze in doppelte {{.. }} setze, dann wird sowieso der remote command server aufgerufen und hier hat CREATE PROCEDURE eh keine Bedeutung.

Aber noch mal zurück zum Thema.
Das Problem war das im QZDASOINIT-Job die Triggerprogramme der zu aktualisierenden Tabelle nicht gefunden wurden.
Hier geht also nur ein SQL-Call mit ADDLIBLE im aktuellen QZDASOiNIT-Job.
Weil Triggerprogrgramme nicht die DB2-Namingkonventionen (*SYS oder *SQL) sondern immer in der *LIBL suchen, wenn in den Triggerprogrammen dynamische unqualifizierte CALLS existieren.

Und leider gibt es bei IBMDA400 nur die properties "default collection" und "catalog library list, welche aber beide keine Auswirkungen auf die Bibliotheksliste haben.
Im Gegensatz zum ODBC-Treiber, wo ich mit dem Parameter DBQ die Bibliotheksliste setzen kann.
Deswegen auch noch mal die Empfehlung von Baldur Fürchau den CA-ODBC-Treiber in Verbindung mit den ADO-Objektenklassen zu verwenden:

cn400.Provider = "MSDASQL"
cn400.Open "DSN=MEINEDSN; DBQ=LIB1,LIB2"

Wenn man keine ODBC-Datenquelle anlegen will, geht dann sogar :

cn400.Open "DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=MEINEAS400;DBQ=LIB1,LIB2"

Hinweis :
Falls kein Provider festgelegt wird, wird die Eigenschaft standardmäßig mit MSDASQL (Microsoft OLE DB Provider für ODBC) vorgegeben.


Sven

rst
23-06-04, 13:27
Ich habe die Syntax in VBA übernommen, ist so OK.

strSQL2 = "ADDLIBLE LIB(LIB1)"
ExecCmd strSQL2, cnn400

strSQL2 = "ADDLIBLE LIB(LIB2)"
ExecCmd strSQL2, cnn400

strSQL2 = "ADDLIBLE LIB3)"
ExecCmd strSQL2, cnn400

Public Sub ExecCmd(MyCmd As String, myCnn As ADODB.Connection)
Dim mySql As String
mySql = "{{CALL QCMDEXC PARM('" & MyCmd & "' " & Format$(Len(MyCmd), "0000000000.00000") & ")}}"
mySql = Mid(mySql, 1, Len(mySql) - 9) & "." & Right(mySql, 8)
myCnn.Execute mySql, , adExecuteNoRecords
End Sub

Nach Ausführen des Codes kommt es weiter zum gleichen Fehler,
die Bibliotheken sind nicht im Zugriff...


Mit Objektsperren arbeiten

System: MeineAS400

Objekt: QNUTZER1 Bibliothek: QSYS Art: *USRPRF



Auswahl eingeben und Eingabetaste drücken.

4=Job beenden 5=Mit Job arbeiten 8=Mit Jobsperren arbeiten



Aus-

wahl Job Benutzer Sperre Status Bereich Thread

QZRCSRVS QUSER *SHRRD HELD *JOB



Objekt: QNUTZER1 entspricht der user id.





Mit Auswahl 5 und 13.Bibliotheksliste anzeigen



Bibliotheksliste anzeigen

System: MeineAS400

Job: QZRCSRVS Benutzer: QUSER Nummer: 165347



Auswahl eingeben und Eingabetaste drücken.

5=Objekte in Bibliothek anzeigen



Aus-

wahl Bibliothek Art Text

QSYS SYS Systembibliothek

QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

QHLPSYS SYS

QUSRSYS SYS

LIB1 USR Installation-Bibliothek ..

LIB2 USR Installation-Bibliothek ..

LIB3 USR Installation-Bibliothek ..

QTEMP USR

QGPL USR



Die Bibliotheken LIB1,LIB2,LIB3 wurden hinzugefügt….

Dieser Job QZRCSRVS läuft in Subsystem QUSRWRK.





Alle Zugriffe per SQL laufen über den JOB QZDASOINIT.



Bibliotheksliste anzeigen

System: MeineAS400

Job: QZDASOINIT Benutzer: QUSER Nummer: 165348



Auswahl eingeben und Eingabetaste drücken.

5=Objekte in Bibliothek anzeigen



Aus-

wahl Bibliothek Art Text

QSYS SYS Systembibliothek

QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

QHLPSYS SYS

QUSRSYS SYS

QIWS PRD

QTEMP USR

QGPL USR





Dieser Job der den SQL Zugriff startet fehlen die Bibliotheken LIB1,LIB2,LIB3

Wie kann man dieses Probelm lösen.

Fuerchau
23-06-04, 13:56
Siehe obige Hinweise, dass "{{call ..}}"-Aufrufe per SBMRMTCMD gelöst werden und daher NICHT im SQL-Serverjob laufen.
Folge also den Hinweisen von Sven und lass eine {-Klammer weg !!!
Oder erstelle halt eine Prozedur für QCMDEXC und verwende sie wie in meinem anderen Link.

rst
23-06-04, 14:25
Ich habe heute nach meinem Urlaub diese Syntax übernommen
Sie ist so Ok und läuft unter VBA (PARM hat gefehlt).
Allerdings tritt immer noch der gleiche Fehler auf,
die Bibliotheken sind für den SQL Zugriff nicht vorhanden.

VBA-Code

Set cnn400 = New ADODB.Connection
cnn400.Open cnnstr400

strSQL2 = "ADDLIBLE LIB(LIB1)"
ExecCmd strSQL2, cnn400

strSQL2 = "ADDLIBLE LIB(LIB2)"
ExecCmd strSQL2, cnn400

strSQL2 = "ADDLIBLE LIB(LIB3)"
ExecCmd strSQL2, cnn400


Public Sub ExecCmd(MyCmd As String, myCnn As ADODB.Connection)
Dim mySql As String
mySql = "{{CALL QCMDEXC PARM('" & MyCmd & "' " & Format$(Len(MyCmd), "0000000000.00000") & ")}}"
mySql = Mid(mySql, 1, Len(mySql) - 9) & "." & Right(mySql, 8)
myCnn.Execute mySql, , adExecuteNoRecords
End Sub


Auf der AS400:



Mit Objektsperren arbeiten

System: MeineAS400

Objekt: QNUTZER1 Bibliothek: QSYS Art: *USRPRF



Auswahl eingeben und Eingabetaste drücken.

4=Job beenden 5=Mit Job arbeiten 8=Mit Jobsperren arbeiten



Aus-

wahl Job Benutzer Sperre Status Bereich Thread

QZRCSRVS QUSER *SHRRD HELD *JOB



Objekt: QNUTZER1 entspricht der user id.





Mit Auswahl 5 und 13.Bibliotheksliste anzeigen



Bibliotheksliste anzeigen

System: MeineAS400

Job: QZRCSRVS Benutzer: QUSER Nummer: 165347



Auswahl eingeben und Eingabetaste drücken.

5=Objekte in Bibliothek anzeigen



Aus-

wahl Bibliothek Art Text

QSYS SYS Systembibliothek

QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

QHLPSYS SYS

QUSRSYS SYS

LIB1 USR Installation-Bibliothek ..

LIB2 USR Installation-Bibliothek ..

LIB3 USR Installation-Bibliothek ..

QTEMP USR

QGPL USR



Die Bibliotheken LIB1,LIB2,LIB3 wurden hinzugefügt….

Dieser Job QZRCSRVS läuft in Subsystem QUSRWRK.





Alle Zugriffe per SQL laufen über den JOB QZDASOINIT.



Bibliotheksliste anzeigen

System: MeineAS400

Job: QZDASOINIT Benutzer: QUSER Nummer: 165348



Auswahl eingeben und Eingabetaste drücken.

5=Objekte in Bibliothek anzeigen



Aus-

wahl Bibliothek Art Text

QSYS SYS Systembibliothek

QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

QHLPSYS SYS

QUSRSYS SYS

QIWS PRD

QTEMP USR

QGPL USR





Dieser Job der den SQL Zugriff startet fehlen die Bibliotheken LIB1,LIB2,LIB3

ich denke hier ligt das Problem!!!!

Hat noch jemand einen Tip.

Sven Schneider
23-06-04, 17:23
Auch auf die Gefahr, dass ich mich wiederhole, hier ist immer noch eine geschweifte Klammer {{...}} zuviel !!!!!

Sven