PDA

View Full Version : ODBC API "SQLColumns" liefert falsche Ergebnise (Dedaultwert einer Spalte)



Tom74
20-11-08, 14:37
Hallo,

ich schreibe ein Programm mit dem ich per ODBC direkt auf Datenbanken zugreife. ich verwende keine Bibliotheken sondern greife direkt auf die ODBC API zu.

Ich habe eine Funktion geschrieben, die mir zu einer Tabelle alle Spalten mit den dazugehörigen Informationen liefert (Datentyp, Länge, Name, usw.). Dazu gehört auch der Defaultwert einer Spalte wenn diese nicht NULL-fähig ist.

SQLColumns liefert aber bei einer AS400 Datenquelle keine Defaultwerte - die Spalte ist leer. Führe ich die gleiche Funktion auf einer SQL Server-Datenquelle aus (Datenbankstruktur identisch wie auf der AS400), so bekomme ich die korrekten Defaultwerte. Weiss jemand was das Probnlem sein könnte ? Ist es eventuell eine Einstellung im ODBC-Treiber selbst ?

Viele Grüße
Thomas

Fuerchau
20-11-08, 14:40
Bei der AS/400 ist das korrekt, da nur vom Standard abweichend Defaults gemeldet werden.
Wenn also NULL nicht erlaubt ist und der Default leer, so ist der Default entsprechend dem Datentyp:
Numerisch => Zero
Zeichen => Blank
Ausnahme Datum/Zeit-Felder und UDT's, wenn nicht NULL muss ein gültiger Wert angegeben werden.

PS:
AS/400-ODBC unterstützt auch Schema-Abfragen (wie die meisten anderen auch), du musst nicht gezielt auf die SYSCOLUMNS gehen.

Tom74
20-11-08, 15:14
Ich habe ja einen Defaultwert der von Standard abweicht.

Die Tabelle ist so definiert:



CREATE TABLE Datei
(
DATEINR INTEGER NOT NULL,
DATEINAME VARCHAR(250) NOT NULL,
DATEIDATUM TIMESTAMP NOT NULL,
DATEIGROESSE INTEGER NOT NULL,
KOMPRIMIERT SMALLINT NOT NULL,
TYPGRP SMALLINT NOT NULL DEFAULT 1001,
TYP SMALLINT NOT NULL,
PRIMARY KEY (DATEINR)
);
Für die Spalte "TYPGRP" ist ein Defaultwert von 1001 definiert. Die Tabelle gibts sowohl auf einem SQL-Server als auch auf der AS400. Über die ODBC Funktion "SQLColumns" bekomme für diese Spalte als Defaultwert "(1001)" angezeigt (was ja auch korrekt ist), wenn ich auf die SQL-Server Datenquelle zugreife. Die AS400-Datenquelle liefert hingegen einen NULL-Wert (Feldlänge = 0). Aber in diesem Fall weicht die 1001 doch deutlich von dem nummerischen Defaultwert ab (0), so dass ich diese 1001 auch hier erwartet hätte.

Meine Idee war nun tatsächlich, die Defaultwerde über SYSCOLUMNS auszulesen, was aber wenig elegant ist da man auf die Datenbankunabhängigkeit verzichten muss.


AS/400-ODBC unterstützt auch Schema-Abfragen (wie die meisten anderen auch), du musst nicht gezielt auf die SYSCOLUMNS gehen.Das habe ich leider nicht verstanden :( Was sind Schema-Abfragen und wie "verwende" ich diese ?

Danke für die Auskunft und Viele Grüße

Thomas

Fuerchau
20-11-08, 17:10
Mit welchen Methoden greifst du auf ODBC zu ?
Mit ADO z.b. gibts die Methode MyConnection.OpenSchema(...).

Tom74
20-11-08, 20:34
Ich benutze ODBC direkt

http://msdn.microsoft.com/en-us/library/ms714562(VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms714562%28VS.85%29.aspx)

Grüße
Thomas

Fuerchau
21-11-08, 09:01
Warum so kompliziert und nicht mit ADO ?
Aber seis drum. Um Datenbankneutral zu arbeiten kannst du die Funktionen:

SQLTables SQLTables Function (http://msdn.microsoft.com/en-us/library/ms711831(VS.85).aspx)

sowie SQLColumns
SQLColumns Function (http://msdn.microsoft.com/en-us/library/ms711683(VS.85).aspx)

verwenden.
Im jeweiligen Resultset erhältst du die nötigen Informationen. Je nach Datenbank gibt es mal mehr, mal weniger Informationen.
Für alle DB's gilt, um ODBC-Conform zu sein, ein Minimum an vorhandenen Feldern.

Allerdings gibt es über den Defaultwert selber tatsächlich keine Info.

Sven Schneider
11-12-08, 19:27
Den Feld COLUMN_DEF der Funktion SQLColumns gibt es seit ODBC 3.0.
Und du denkst bei der Weiterverarbeitung auch daran, das das Feld COLUMN_DEF als VARCHAR(254) zurückkommt, auch wenn dein Feld TYPGRP als SMALLINT mit DEFAULT 1001 definiert ist.

Mit welcher Version und SP von Client Access arbeitest du denn?

Also ab V5R1 sollte es zumindest funktionieren.
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/cli/rzadpfncolnpriv.htm

Schalte doch mal den ODBC-Trace ein, was steht denn dann in der SQL.LOG.

Alternative:
Eine Abfrage auf die ANS and ISO catalog view CULUMNS ist aber auch DB unabhängig.