Announcement

Collapse
No announcement yet.

Primary Key und Index aus ODBC-Verbindung auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Primary Key und Index aus ODBC-Verbindung auslesen

    Hallo Gemeinde

    ich versuche aus einer ODBC-Verbindung von einer ausgelesenen Tabelle die Primary-Keys zu ermitteln.
    Die Tabellen habe ich mittels "OdbcConnction.GetSchema("Tables")" gefunden, aber ich bekomme keine PrimaryKeys.

    Wie kann ich die PKs auslesen?

    Vielen Dank
    Gruß Winfried

  • #2
    Bist Du sicher, dass auch welche definiert sind?
    https://msdn.microsoft.com/de-de/lib...vs.110%29.aspx
    https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx
    Gruß, defo

    Comment


    • #3
      Auf was für eine Datenbank bist du denn verbunden?

      Rein über ODBC bekommst du es vermutlich nicht heraus. Du kannst dich via ODBC ja auch auf Excel Tabellen oder CSV-Files verbinden, dort gibt es gar keine Primary Keys.

      Bei den "richtigen" Datenbanken kann man solche Sachen direkt via SQL abfragen, bei Oracle beispielsweise sieht es so aus:

      [HIGHLIGHT=SQL]
      SELECT OWNER, TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, POSITION
      FROM ALL_CONSTRAINTS
      JOIN ALL_CONS_COLUMNS USING (OWNER, TABLE_NAME, CONSTRAINT_NAME)
      WHERE CONSTRAINT_TYPE = 'P'
      AND TABLE_NAME = '???';
      [/HIGHLIGHT]

      Gruss

      Comment


      • #4
        Hallo zusammen,

        danke für die Hinweise, ich habe das Problem mittlerweile gelöst.

        Der entscheidende Punkt ist dies hier

        Code:
        Dim selection As String() = New String() {Nothing, Nothing, Tablename, Nothing}
        x = mCore.mDBMgr.OdbcConnction.GetSchema("Indexes", selection)
        wobei mCore.mDBMgr mein eigener Datenbank Manager ist.
        Über OdbcConnction.GetSchema("Indexes", selection) bekomme ich dann eine Datatable zurück

        Code:
        For Each lrow As DataRow In x.Rows
            If lrow.Item(8) = lColumn.ColumnName Then
                If CStr(lrow.Item(5)).StartsWith("PK_") Then
                    'Do Something
                End If
            End If
        Next
        In
        Code:
        lrow.Item(8)
        steht der Name der Name des Indizes drin, und mit

        Code:
        lrow.Item(5)).StartsWith("PK_")
        Prüfe ich, ob es sich um einen PrimaryKey handelt.


        Danke und Gruß
        Winfried

        Comment


        • #5
          Originally posted by MacGyver65 View Post
          Hallo zusammen,

          danke für die Hinweise, ich habe das Problem mittlerweile gelöst.

          In
          Code:
          lrow.Item(8)
          steht der Name der Name des Indizes drin, und mit

          Code:
          lrow.Item(5)).StartsWith("PK_")
          Prüfe ich, ob es sich um einen PrimaryKey handelt.
          Ich würde sagen, nicht wirklich gelöst oder mindestens nicht zuverlässig.
          Du hast zwar noch nicht Deine DB verraten, aber was Du da prüfst, beruht auf den (nicht ganz wasserdichten) Annahmen, dass
          - ein Primary Key Constraint immer mit einem Index versehen ist und dass
          - der Indexname immer mit "PK_" beginnt

          Keine Ahnung, was dieser Datenbankmanager ist, aber wenn er es erlaubt Indizes abzufragen, geht das vielleicht auch mit Constraints, genauer Key Constraint, noch genauer Primary Key Constraints (es gibt ja auch andere). Wenn Du dabei dann Treffer findest, die zu Deiner Tabelle gehören, dann wäre es m.E. gelöst.

          Ein Index ist nichts weiter als eine technische Ergänzung von Tabellen, die meist der Beschleunigung des Zugriffs dient. Auch wenn moderne Systeme Indizes für Schlüsselfelder meist automatisch anlegen und automatisch benennen, wenn ein Key Constraint erzeugt wird, ist deren Existenz nicht garantiert. Ein Index kann ohne PK existieren, ebenso wie ein PK ohne Index existieren kann. Auch wenn die Begriffe dafür oft synonym verwendet werden und der Unterschied auch oft nicht bekannt ist, gibt es m.E. nirgends eine funktionale Zwangskoppelung dieser Mechanismen.

          Wenn Du also auf dieser Basis ein dynamisches Verfahren baust, das der Kenntnis von Primärschlüsseln bedarf, landest Du damit vermutlich irgendwann auf der Nase.
          Gruß, defo

          Comment

          Working...
          X