Seite 1 von 1

[solved] MySQL und QSqlField::isAutoValue()

Verfasst: 10. Januar 2008 19:38
von solarix
Hallo!
Ich dachte mir, ich koennte mit QSqlField Metadaten ueber eine Tabelle abrufen:

Code: Alles auswählen

  QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","TEST");
  db.setHostName("host");
  db.setDatabaseName("schema");
  db.setUserName("user");
  db.setPassword("...");
  db.open();
  QSqlQuery query = db.exec("SELECT * FROM foo");

  qDebug() << query.record().field(0).isAutoValue(); // auto_increment auf Column 0 ?
Folgende Vorraussetzungen:
* Datenbank, Tabelle mit Daten, Verbindung usw. vorhanden
* Column 0 ist ein [`ID` bigint(20) unsigned NOT NULL auto_increment] und primary key

Was koennte der Grund sein, dass "isAutoValue()" false bringt?
Auch ein

Code: Alles auswählen

  db.driver()->record("foo").field(0).isAutoValue();
bringt ueberhaupt nichts.. auf saemtliche Tabellen mit einem auto_increment-Primary-Key wird "false" zurueckgegeben.. auch die Trolltech Demo "sqlbrowser" liefert bei saemtlichen Tabellen der Datenbank trotz "auto_increment-Flag" jeweils "false" bei "AutoValue"...

Qt 4.3.2/Mysql 5.0.21

hints?

Verfasst: 11. Januar 2008 02:10
von patrik08
Mit mysql version 5 < hatte ich auch kein gluck mit den index zu finden
ich habe einfach die SHOW COLUMNS gefragt die sagen alles....

Code: Alles auswählen

    QString grepprimary,grepauto,INDEXFIELD;
    /* reset index  fieldname */
    FieldNameList.clear();
    const QString info = QString("SHOW COLUMNS FROM %1").arg(table);
    QSqlQuery query(info,db);
    QSqlRecord rec = query.record();
            while (query.next()) {
                grepprimary = query.value(3).toString();
                grepprimary = grepprimary.toLower();
                grepauto = query.value(5).toString();
                grepauto = grepauto.toLower();
                if (grepprimary == "pri" && grepauto.contains("auto")) {
                    INDEXFIELD = query.value(0).toString();
                }
                FieldNameList.append(query.value(0).toString());
            }
        
     if (INDEXFIELD.size() < 1) {
      haveindex = false;
     } else {
      haveindex = true; 
     }

mit 5.0.24a-Debian geht es besser mit QSqlQueryModel der ist super auch als container .... oder als return uebergabe von QThread

Code: Alles auswählen


    QSqlQueryModel *model = new QSqlQueryModel();
    model->setQuery("SELECT * FROM foo",db);
    const int C_summe = model->columnCount();
    const int R_summe = model->rowCount();
    if ( R_summe > 0) {
        /* nur erste line sondieren */
        QSqlRecord rbase = model->record(0);
        for (int i = 0; i < C_summe; ++i) {
                  const QString feld_name = rbase.fieldName(i);
                  QString value = rbase.value(feld_name).toString();
                  if ( rbase.field(i).isAutoValue() ) {
                  qDebug() << "### isAutoValue -> " << feld_name;  
                  } else {
                  qDebug() << "### !not AutoValue -> " << feld_name;
                  }
        }
        
    }


Verfasst: 11. Januar 2008 09:54
von solarix
Mittlerweile habe ich's durchgegrept... leider wird das Flag nur vom SQLITE-Treiber gesetzt.. da wird es true gesetzt, wenn eine Kolonne ein "integer primary key" ist (scheint so zu sein bei diesem Treiber).

MySQL verwendet das Flag (bisher) nicht :(

Ich habe mir nun dein "SHOW COLUMNS"-Workaround eingebaut.. das klappt auch gut.
mercy!