PDA

View Full Version : ODBC-Zugriff (ISERIES) - Resultset unvollständig



cwalk
08-09-11, 15:02
Hallo,

ich greife per ODBC auf eine DB2-DB zu und habe nun folgendes Phänomen:

1. Select * from Tabelle1 => liefert 1000 Datensätze

2. Select col1 from Tabelle1 => liefert 1140 Datensätze

Eigentlich sollte die Anzahl der gelieferten Datensätze doch identisch sein.?

Wenn nun einer der fehlenden Datensätze kopiert, dann gelöscht und im Anschluss wieder in Tabelle1 eingefügt wird, ist der Datensatz wieder Bestandteil des (ersten) Resultsets.

Kann jemand sagen, womit dies zusammenhängt? Vielen Dank

Fuerchau
08-09-11, 16:27
Hier ist leider Raten angesagt, da der Code (also wie du es genau machst) fehlt und zum Raten habe ich keine Lust :).

BenderD
08-09-11, 17:38
...null values?

!ich bin ein unnötiges Füllsel, damit man das speichern kann!

cwalk
09-09-11, 07:07
Hier ist leider Raten angesagt, da der Code (also wie du es genau machst) fehlt und zum Raten habe ich keine Lust :).

Danke für die ersten Antworten. Ich bin kein AS400/DB2-Kenner, daher die etwas flapsige Problembeschreibung. Da ich jedoch auf Daten der DB2 zugreifen muss, versuche ich mein Problem noch etwas detaillierter zu schildern.

Für den Zugriff auf die DB2 habe ich auf einem SQL Server 2005 (Standard) einen Linked Server eingerichtet. Verwendet habe ich hierfür den iSeries Access for Windows ODBC-Treiber. Im Anschluss habe ich dann einen View auf eine der DB2-Tabellen in der SQLServer Datenbank erstellt:

CREATEVIEW[dbo].[table1]
AS
SELECT*
FROMDB2.CATALOG.LIB.table1AStable1

(liefert z.B. 1300 Datenzeilen)

Beim Prüfen des Views ist aufgefallen, dass einige Datensätze fehlen bzw. nicht gelistet werden. Verändert man den View und selektiert nicht alle Spalten, dann ändert sich plötzlich auch die Menge der zurückgegebenen Datenzeilen:


CREATEVIEW[dbo].[table1]
AS
SELECTcol1, col2 FROMDB2.CATALOG.LIB.table1AStable1

(liefert z.B. 1500 Datenzeilen - auch nicht vollständig)

Beim weiteren Prüfen ist uns dann wie bereits beschrieben folgendes aufgefallen: Wird ein Datensatz, der im "select *" nicht enthalten ist, gelöscht und im Anschluss wieder in die Tabelle eingefügt, ist er auch wieder Bestandteil des Resultsets von "select *". Es scheint sich also wohl um ein Treiber-Problem zu handeln. Allerdings habe ich keine Ahnung, wo ich ansetzen kann. Die fehlenden Datenzeilen des Views unterscheiden sich inhaltlich nicht weiter von den restlichen Datenzeilen.:confused:

Fuerchau
09-09-11, 08:36
OK, das ist dann etwas klarer.
Hier müssen die Daten auf der AS/400 erst mal SQL-mäßig auf Richtigkeit geprüft werden.
Will heißen, dass eine Anwendung auf der AS/400, die nicht in SQL geschrieben ist, leider ungültige Daten in eine Tabelle schreiben kann.
Eine Datenzeile mit ungültigen Daten kann man auf der AS/400 per STRSQL in der Anzeige mit "++++" sehen.

Durch deine Methode des Löschens und wieder einfügens berichtigst du die Daten für SQL, so dass wieder alles gelesen werden kann.

Dies ist KEIN Treiber- sondern ein Datenproblem.

Ggf. kannst du das näher einschränken, wenn du dich Feld für Feld durcharbeitest.

Pikachu
09-09-11, 09:45
Was liefern denn SLECT COUNT(*) ... und SELECT COUNT(COL1) ... als Werte zurück?