[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Mar 2007
    Beiträge
    15

    ODBC API "SQLColumns" liefert falsche Ergebnise (Dedaultwert einer Spalte)

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2007
    Beiträge
    15
    Ich habe ja einen Defaultwert der von Standard abweicht.

    Die Tabelle ist so definiert:

    Code:
    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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Mit welchen Methoden greifst du auf ODBC zu ?
    Mit ADO z.b. gibts die Methode MyConnection.OpenSchema(...).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Mar 2007
    Beiträge
    15
    Ich benutze ODBC direkt

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

    Grüße
    Thomas

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Warum so kompliziert und nicht mit ADO ?
    Aber seis drum. Um Datenbankneutral zu arbeiten kannst du die Funktionen:

    SQLTables SQLTables Function

    sowie SQLColumns
    SQLColumns Function

    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Jun 2001
    Beiträge
    727
    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/infoce...fncolnpriv.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.

Similar Threads

  1. SQL-Performance Probleme ODBC
    By berndl in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 13-10-06, 09:28
  2. ODBC update
    By synus in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 06-10-06, 15:38
  3. Update via ODBC
    By mdhl in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 18-05-06, 13:27
  4. ODBC Verbindung (User, Password)
    By Hubert in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 12-05-06, 11:52
  5. ODBC Verbindungs Fehler (-7778)
    By Hubert in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 10-05-06, 09:41

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •