PDA

View Full Version : ODBC greift auf falsche Bibliothek zu



Seiten : [1] 2

Hubert
11-02-10, 13:27
Hallo zusammen,

ich verzweifle fast: in Excel habe ich einen ODBC Zugriff, der auf eine Bibliothek zugreifen will, die es nicht gibt. Der Name der Bibliothek, auf die er zugreifen will, entspricht dem Namen des angemeldeten Benutzers.


strSelect = "SELECT * FROM DIVL00 WHERE " & _
"XPFIRM = '" & pFirma & "' " & _
"AND XPANWG = 'WAW' " & _
"AND XPSA = '060' " & _
"AND XPRKEY = 'ARDIPU'"
With rsAS400
.CursorType = adOpenForwardOnly
.CursorLocation = adUseClient
.Open strSelect, conAS400
End With


Gebe ich die Datei qualifiziert mit Bibliotheksnamen an, ist alles in Ordnung.

Kann mir jemand erklären, warum die Kiste immer mit dem SQL Fehler SQL0204 reagiert?

Herzlichen Dank

Hubert

AS400.lehrling
11-02-10, 13:41
Hallo zusammen,

ich verzweifle fast: in Excel habe ich einen ODBC Zugriff, der auf eine Bibliothek zugreifen will, die es nicht gibt. Der Name der Bibliothek, auf die er zugreifen will, entspricht dem Namen des angemeldeten Benutzers.

Weshalb änderst du nicht in Excel den beutzernamen in Bibliotheksnamen :confused:

Das sollte doch das prob umschiffen - klar ist nicht so wirklich astrein., aber wenn es funktioniert.

Gruß AS400.lehrling

Hubert
11-02-10, 13:59
Dies war ja nur eine einzelne Abfrage; in dem Programm gibt es noch jede Menge. Und je nach Umgebung sind die Bibliotheksnamen unterschiedlich. Deshalb will ich ja auch über die LIBL zugreifen. Was ich nicht verstehe, dass da in einer Bibliothek gesucht wird, die

1. nicht von mir angegeben wurde
2. nicht in der LIBL steht
3. auf der Maschine überhaupt nicht existiert.

Die Verbindung wird hiermit geöffnet:


strConn = "DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=" & _
strSystem & ";LANGUAGEID=ENU;PKG=QGPL/DEFAULT(IBM),2,0,1,0,512;" & _
"DESC=Verbindung;TRANSLATE=1;SSL=;User Id=" & strUser & _
"; Password=" & strPWD & ";"
With conAS400
.ConnectionString = strConn
.CursorLocation = adUseClient
.Mode = adModeReadWrite
.Open strConn
End With

Das hab ich aus einer anderen Excel Tabelle übernommen, wo es nicht zu diesen Problemen kommt.

AS400.lehrling
11-02-10, 14:19
Dies war ja nur eine einzelne Abfrage; in dem Programm gibt es noch jede Menge. Und je nach Umgebung sind die Bibliotheksnamen unterschiedlich. Deshalb will ich ja auch über die LIBL zugreifen. Was ich nicht verstehe, dass da in einer Bibliothek gesucht wird, die

1. nicht von mir angegeben wurde
2. nicht in der LIBL steht
3. auf der Maschine überhaupt nicht existiert.

Die Verbindung wird hiermit geöffnet:


strConn = "DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=" & _
strSystem & ";LANGUAGEID=ENU;PKG=QGPL/DEFAULT(IBM),2,0,1,0,512;" & _

Wo kommt den PKG=QGPL/DEFAULT her ?
Das ist doch die definition der sitzung bzw des zugriffs auf die i5.

Schau dir doch mal auf der i5 an was da unter QGPL/DEFAULT in DEFAULT steht.

Müste ja eine Lib sein, also teildateien enthalten in denen sich die definition(en) befinden.

Gruß AS400.lehrling

Fuerchau
11-02-10, 14:21
Der Default für den Zugriff per ODBC ist bei unqualifizierten Tabellen immer der Username der Anmeldung als Lib !
Man kann die Defaultlib in der Verbindung angeben, so dass diese geändert wird.
Allerdings sucht ODBC alle Tabellen ohne Lib ausschließlich in dieser Lib.

Man kann auch noch das sog. Naming in System ändern und eine Libl angeben, dann wird auch über LIBL gesucht, der Tabellenname ist dann aber wieder "Lib/Name" statt "Lib.Name".

Das halte ich aber für wenig sinnvoll, da sowieso eine LIBL angegeben werden muss, der Default ist nämlich auch hier der Systemwert QUSRLIBL und daher nicht benutzerspezifisch.

Am besten erstellst du für jeden User eine DSN (ODBC-Datenquelle) und trägst dort die Lib als Default ein.
In der Verbindung gibst du dann nur noch
"DSN=MyDsn"
an, der Benutzer bekommt ggf. auch noch ein Anmeldebild ob er das denn auch darf.

BenderD
11-02-10, 14:22
... das liegt am naming(*SQL), das ist eine Property in den Treiber Einstellungen, bei naming(*SYS) gehts nach libl

D*B


Hallo zusammen,

ich verzweifle fast: in Excel habe ich einen ODBC Zugriff, der auf eine Bibliothek zugreifen will, die es nicht gibt. Der Name der Bibliothek, auf die er zugreifen will, entspricht dem Namen des angemeldeten Benutzers.


strSelect = "SELECT * FROM DIVL00 WHERE " & _
"XPFIRM = '" & pFirma & "' " & _
"AND XPANWG = 'WAW' " & _
"AND XPSA = '060' " & _
"AND XPRKEY = 'ARDIPU'"
With rsAS400
.CursorType = adOpenForwardOnly
.CursorLocation = adUseClient
.Open strSelect, conAS400
End With


Gebe ich die Datei qualifiziert mit Bibliotheksnamen an, ist alles in Ordnung.

Kann mir jemand erklären, warum die Kiste immer mit dem SQL Fehler SQL0204 reagiert?

Herzlichen Dank

Hubert

Fuerchau
11-02-10, 14:22
@Hubert
PKG ist ein SQLPKG in dem die AS/400 die SQL's zwecks Optimierung ablegt.
Per PRTSQLINF kann man sich anschauen,welche SQL's da so gemacht wurden.

andreaspr@aon.at
12-02-10, 06:41
Wenn du die lib im connection-objekt angeben möchtest, kannst du das mit:

DBQ=MYLIB;

und viele weitere optionen findest du hier: Connection string keywords (http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzaik/connectkeywords.htm)

lg andreas

Hubert
12-02-10, 12:04
Ich muss mehrere Dateien lesen, die teilweise in verschiedenen Bibliotheken stehen. Ich habe nach den Hinweisen, die ich bekommen habe, den Connection String angepasst:


strconn = "DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=" & _
strSystem & ";LANGUAGEID=ENU;PKG=QGPL/DEFAULT(IBM),2,0,1,0,512;" & _
"DBQ=" & strLibl & ";" & _
"DESC=Verbindung;TRANSLATE=1;SSL=;User Id=" & strUser & _
"; Password=" & strPWD

In strLibl sind alle Bibliotheken, die in Frage kommen. Ich hab es mit Blank als Separator versucht und mit Komma: Es wird immer auf die erste Bibliothek in der LIBL zugegriffen, auch wenn die Datei in einer anderen LIB steht.

BenderD
12-02-10, 12:43
... dein naming steht immer noch auf SQL, da fehlt noch NAM=1 und ein Blick in das Handbuch wäre auch nicht schlecht!!!

D*B


Ich muss mehrere Dateien lesen, die teilweise in verschiedenen Bibliotheken stehen. Ich habe nach den Hinweisen, die ich bekommen habe, den Connection String angepasst:


strconn = "DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=" & _
strSystem & ";LANGUAGEID=ENU;PKG=QGPL/DEFAULT(IBM),2,0,1,0,512;" & _
"DBQ=" & strLibl & ";" & _
"DESC=Verbindung;TRANSLATE=1;SSL=;User Id=" & strUser & _
"; Password=" & strPWD

In strLibl sind alle Bibliotheken, die in Frage kommen. Ich hab es mit Blank als Separator versucht und mit Komma: Es wird immer auf die erste Bibliothek in der LIBL zugegriffen, auch wenn die Datei in einer anderen LIB steht.