MySQL: festgelegte Spaltenbreite einer Spalte für BCB6 bestimmen



  • Hallo,
    ich greife mit BCB6 auf eine MySQL-Datenbank zu und benötige die festgelegte Breite einer Spalte möglichst als Zahl (int).

    Unter MySQL kann ich über eine Abfrage mit DESCRIBE DB_Name.Tabelle_Name Feld_Name folgende Infos erhalten:

    Beispiel:
    Field___Type________Null____Key__Default__Extra
    Name__Varchar(20)___Yes_________NULL

    Es ist zwar möglich mit dem BCB aus dem String "Varchar(20)" die Spaltenbreite mit Länge 20 als Zahl herauszufiltern aber ganz schön umständlich.
    Bisher habe ich leider keinen weiteren Anhaltspunkt in MySQL gefunden.

    Kann mir jemand sagen, ob es hier eine elegantere Möglichkeit gibt.



  • Greifst du mit der C-API auf die Datenbank zu?
    Dann kannst du, wenn du eine Abfrage gemacht hast, mit mysq_fetch_field() Informationen über die Datenbankfelder der Ergebnismenge erhalten. Diese sind vom Typ MYSQL_FIELD http://dev.mysql.com/doc/refman/5.0/en/c-api-datatypes.html

    Andernfalls musst du die Hilfe deiner Datenbank-Komponente befragen oder im BCB-Forum mal Fragen.

    mfg
    xXx



  • Wenn du doch die VCL-Komponenten benutzt, dann kannst du mittels
    TDataSet::FieldDefs::Size bzw. TDataSet::Fields::Size die Größe von variablen Spaltengrößen (z.B. Varchar(x)) ermitteln (ansonsten ist Size immer 0).
    Fast jede Datenbankkomponente ist von TDataSet abgeleitet, so daß ein Zugriff darauf kein Problem ist (du mußt nur einmal ein SELECT-Statement absenden).



  • Hallo @Th und @-=]xXx[=- ,
    Dankeschön für Eure Antworten.

    Habe in der VCL-Hilfe geschmökert und doch noch eine Lösung gefunden, die in die in Richtung geht, die @Th vorschlägt. Mit DisplayWidth erhalte ich exakt die Spaltenbreiten, die die MySQL-Tabelle hat.

    TADODataSet *adoDS; 
    adoDS = new TADODataSet(NULL); 
    adoDS->Connection = ADOConnection1;
    adoDS->CommandType = cmdText;
    adoDS->CommandText = AdoSQL; //z.B. AnsiString AdoSQL="SELECT *....
    adoDS->Open(); 
    bool okay = (adoDS->RecordCount > 0); // DS vorhanden
    if (okay){
      int* Spalten = new int[adoDS->RecordCount];
      for (int i=0; i<adoDS->FieldCount; i++) Spalte[i] = adoDS->Fields->Fields[i]->DisplayWidth;
      //weitere Bearbeitung mit den ermittelten Spaltenbreiten...
      delete []Spalten;
    };
    adoDS->Close(); 
    delete adoDS;
    

Anmelden zum Antworten