Anmelden

View Full Version : Problem ODBC und VB.NET



Marsman
11-07-06, 08:29
Hallo!

Ich weiß, dies ist gewiss kein Visual-Basic Forum und Visual-Basic wird nicht von allen geliebt. Dennoch habe ich im Zusammenhang mit der iSeries ein Problem, bei dem ich mir hier Hilfe erhoffe:

Und zwar lese ich per ADO.NET über ODBC Datensätze aus einer DB-Datei auf der iSeries. Dabei kommt wie üblich eine SQL-SELECT-Anweisung zum Zuge. Die Datensätze der Datei werden auch gelesen. Allerdings werden in der SELECT-Anweisung vorhandene Parameter wie WHERE oder ORDER BY völlig ignoriert. Es werden immer alle Sätze in willkürlicher Folge abgerufen. Der ODBC-Treiber ist "iSeries Access ODBC-Driver".

Ich habe für dieses Verhalten keine Erlärung. Wenn mir zumindest jemand sagen könnte, wie ich dem Problem auf die Spur komme, wäre ich schon froh. Ich habe mal einen DB-Trace gemacht. Aber mit der Datei in QUSRSYS kann ich nicht viel anfangen. Kennt sich hier vielleicht jemand mit diesen Dingen aus und kann mir einen Tipp geben??


Danke schonmal,

Titus

Fuerchau
11-07-06, 08:33
Dazu müsstest du schon mal den SQL posten.
Welchen ADO.NET-Treiber verwendest du ?
Im Zusammenhang mit der AS/400 hat sich, egal welche ADO-Version, der ODBC-Treiber des iSeries-Access am besten bewährt.
Verwende also am Besten ein ADO-Treiber, der für ODBC zuständig ist.

Marsman
11-07-06, 08:52
Hallo Fuerchau!

Um Missverständnisse zu vermeiden, sende ich hier mal den kompletten Code:



Dim myDataReader As OdbcDataReader
Dim myOdbcDbConnection As OdbcConnection
Dim myOdbcDbCommand As OdbcCommand
Dim user, cmdnbr AsString
myOdbcDbConnection = New OdbcConnection("DSN=UDS")
myOdbcDbCommand = New OdbcCommand("SELECT * FROM UDSSOFC WHERE USER = 'TEST' ORDER BY USER, CMDNBR", myOdbcDbConnection)
myOdbcDbConnection.Open()
myDataReader = myOdbcDbCommand.ExecuteReader()
DoWhile (myDataReader.Read())
user = myDataReader.GetValue(0)
cmdnbr = myDataReader.GetValue(1)
Loop
myDataReader.Close()
myOdbcDbConnection.Close()


Wenn ich das richtig sehe, verwende ich den .NET-Treiber V2.0.50727

Gruß, Ttitus

Fuerchau
11-07-06, 09:41
Da haben wir schon das Problem:

USER ist ein reserviertes SQL-Wort und meint den CURRENT USER. Ggf. hat da SQL Schwierigkeiten einen Feldnamen von der SQL-Funktion zu trennen.

Wenn ein Feldname so heißt, wie ein SQL-Schlüsselwort, so ist der Name in Anführungszeichen zu setzen.
Besser wäre jedoch, den Namen zu ändern (ggf. LF, View).

Also:

SELECT * FROM UDSSOFC WHERE "USER" = 'TEST' ORDER BY "USER", CMDNBR

Marsman
11-07-06, 10:19
...tatsächlich, daran lag es!! Und ich hatte die ganze Zeit völlig andere Vermutungen. Fuerchau, du bist mein Meister. Vielen Dank nochmal.


Gruß, Titus

malzusrex
11-07-06, 10:50
Ja das mit dem USER ist heimtükich.

ich hatte es mal geschafft ne ganze firma lahm zulegen. es gab dort eine datei, in der war hinterlegt, wer auf welche firma/mandant zugriff hat. ich wollt nur MEINE über arbeiten und habe ein sql abgesetzt

delete from MyFile where USER = 'MALZ'

naja, und am ende war alles wech. *grin*
aber es gibt ja immer noch wrkdbfundl. damit war der tag gerettet und ich eine GROßE kaffeerunde ärmer und habe dazu gelernt, sowas wie USER eben in anführungszeichen zu setzten.

gruß ronald