Announcement

Collapse
No announcement yet.

Access Felder prüfen

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

  • Access Felder prüfen

    Hallo,

    gibt es eine Möglichkeit, mit der ich über ADO prüfen kann, ob in einer Access-DB bestimmte Felder vorhanden sind und welche Eigenschaften diese besitzen?

    Vielen Dank schonmal

  • #2
    Hallo,

    ja, wobei sowohl ADO als auch ADOX (ADO Extension for Data Definition Language and Security) entsprechende Informationen liefern.

    Die beiden folgenden Beispiele greifen auf die Methode <b>OpenSchema</b> von ADO (Connection-Objekt) zurück. Das erste Beispiel nutzt nur das native ADO-Objekt Connection:
    <pre>
    <b>procedure</b> TForm1.ButtonTablesClick(Sender: TObject);
    <b>var</b>
    aCon : _Connection;
    aRS : _Recordset;
    sData: <b>String</b>;
    <b>begin</b>
    ListBoxData.Items.Clear;
    aCon := CoConnection.Create;
    aCon.Open(cCS, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, adConnectUnspecified);
    <b>try</b>
    aRS := aCon.OpenSchema(adSchemaTables,EmptyParam,EmptyPar am);
    <b>while</b> <b>not</b> aRS.EOF <b>do</b> <b>begin</b>
    sData := Format(<font color="#9933CC">'%s.%s.%s'</font>, [aRS.Fields[0].Value,
    aRS.Fields[1].Value, aRS.Fields[2].Value]);
    ListBoxData.Items.Add(sData);
    aRs.MoveNext;
    <b>end</b>;
    <b>finally</b>
    aCon.Close;
    <b>end</b>;
    <b>end</b>;

    </pre>
    Das zweite Beispiel greift auf TADOConnection und TADODataSet zurück, um die Daten im TDBGrid anzuzeigen:
    <pre>
    <b>procedure</b> TForm1.ButtonOpenSchemaClick(Sender: TObject);
    <b>var</b>
    aSI : TSchemaInfo;
    i : Integer;
    <b>begin</b>
    <b>case</b> RadioGroupQueryType.ItemIndex <b>of</b>
    0 : aSI := siColumns;
    1 : aSI := siPrimaryKeys;
    2 : aSI := siTableConstraints;
    3 : aSI := siIndexes;
    4 : aSI := siForeignKeys;
    5 : aSI := siPrimaryKeys;
    <b>end</b>;
    ADOConnection1.OpenSchema(aSI, EmptyParam, Emptyparam,
    ADODataSet1);
    <b>with</b> ADODataSet1 <b>do</b>
    <b>for</b> i := 0 <b>to</b> Pred(Fields.Count) <b>do</b>
    Fields[i].DisplayWidth := 4;
    <b>end</b>;
    </pre>
    Das Auslesen über ADOX würde dann so aussehen:
    <pre>
    <b>uses</b> ADOX_TLB, ADODB_TLB;

    <b>procedure</b> TFormMain.ButtonShowTablesClick(Sender: TObject);
    <b>var</b>
    aConnection : _Connection;
    aCatalog : _Catalog;
    aTable : _Table;
    swConnString: WideString;
    iRecCount : Integer;
    i : Integer;
    <b>begin</b>
    <font color="#003399"><i>// Step 1: Connection-Objekt</i></font>
    aConnection:= CoConnection.Create;
    swConnString := <font color="#9933CC">'Provider=Microsoft.Jet.OLEDB.4.0; '</font> +
    <font color="#9933CC">'Data Source=C:\Database\dbdemos.mdb;'</font> +
    <font color="#9933CC">'Persist Security Info=False'</font>;
    aConnection.Open(swConnString, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, -1);
    <font color="#003399"><i>// Step 2: Catalog-Objekt</i></font>
    aCatalog := CoCatalog.Create;
    aCatalog.Set_ActiveConnection(aConnection);
    iRecCount := aCatalog.Tables.Get_Count;
    ListBoxTableName.Items.Add(Format(<font color="#9933CC">'%d Tabellen vorhanden'</font>,[iRecCount]));
    <b>for</b> i := 0 <b>to</b> iRecCount - 1 <b>do</b>
    <b>begin</b>
    aTable := aCatalog.Tables.Item[i];
    ListBoxTableName.Items.Add(aTable.Name);
    <b>end</b>;
    aConnection.Close;
    <b>end</b>;

    </pre>
    Da ADOX nur eine Erweiterung von ADO ist, müssen zum Zugriff beide Typbibliotheken eingebunden werden. Ausserdem muss das Programm über das Connection-Objekt von ADO zuerst eine Verbindung zur Datenbank herstellen. Erst dann kann das erzeugte <b>Catalog</b>-Objekt mit dieser bereits bestehenden Verbindung verbunden werden. ADOX verwaltet in der <b>Tables</b>-Kollektion für jede Datenbanktabelle ein eigenständiges <b>Table</b>-Objekt, so das das Programm zuerst die Anzahl der Tabellen der Datenbank ausliest. Anschliessend kann jedes einzelne Table-Objekt aus der Kollektion abgefordert werden - wobei sich das Beispielprogramm nur auf das Auslesen des Tabellennamens beschränkt. Als Erweiterung könnte für jede Tabelle auch jede Tabellenspalte (<b>Column</b>-Objekt) über die <b>Columns</b>-Kollektion ausgelesen werden

    Comment


    • #3
      Vielen Dank Herr Kosch

      Comment

      Working...
      X