[gelöst] QSqlQuery und size() - bin ich verrückt?

Alles rund um die Programmierung mit Qt
Antworten
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

[gelöst] QSqlQuery und size() - bin ich verrückt?

Beitrag von oberschlingel »

Hallo,
ich habe folgenden Code:

Code: Alles auswählen

QSqlQuery query;
query.exec("SELECT * FROM beispieltabelle;");
int temp = query.size();
Wert von temp = -1

Die Abfrage wird aber erfolgreich ausgeführt, wenn ich sie anschliessend mit query.next() durchlaufe, bekomme ich auch alle Werte zurück.

numRowsAffected() wäre an dieser Stelle zwar falsch, habe es trotzdem probiert: gibt 0 zurück.

Ich verwende Qt 4.1.1

Spinne ich? Hat jemand Rat?

DANKE!
Zuletzt geändert von oberschlingel am 29. April 2006 03:08, insgesamt 1-mal geändert.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: QSqlQuery und size() - bin ich verrückt?

Beitrag von patrik08 »

oberschlingel hat geschrieben:Hallo,
Ich verwende Qt 4.1.1
Hatte auch komische dinge mit 4.1.1... window besonder mit sqlite und qlocale....
als ich 4.1.2 gebuildet habe ist es viel besser....

hingegen auf meinen mac lauft alles einfach alles rund mit qt ... egal !version...

probier mal die kolonne zu zaehlen ....
oder ein dump export...

Code: Alles auswählen

void Gui_Starter::TablesDump(QString t,QString file)
{
     QString tablequery ="SELECT * FROM "+t;
     QString line;
     QString rowone;
     QSqlQuery query;
     query.exec(tablequery);
     QSqlRecord rec = query.record();  /* nummer col */
     int numcol = rec.count();
     int loop;
          while (query.next()) {
            line="";
              for(loop=0; loop < numcol; loop++) {
                  rowone = query.value(loop).toString();
                  rowone.replace(QString("'"), QString("\'"));
                  
                    if (!is_numeric(rowone)){
                       rowone = QString( "'%1'" ).arg( rowone );  
                      }
                      
                  if (loop !=numcol-1) {
                    line = line+QString( "%1," ).arg( rowone ); 
                  } else {
                   line = line+rowone;   
                  }
               rowone="";
              }
                line.prepend("INSERT INTO "+t+" VALUES (");
                line.append(");");                
            file_put_contents_append(file,line);
        }
}

alles linken....

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlTableModel>
#include <QSqlRelationalTableModel>
#include <QSqlRelationalDelegate>
#include <QHeaderView>
#include <QSqlRecord>

QT += sql ... im pro
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Beitrag von oberschlingel »

Hallo Patrik,

danke für die Antwort, habe das Problem eben selbst gelöst.
Man muss in der Qt Doku nicht unter "QSqlQuery" nachsehen, sondern unter "QtSql", also eine ordentliche Ebene höher. Dann findet man folgendes:

Code: Alles auswählen

QSqlDatabase defaultDB = QSqlDatabase::database();
if (defaultDB.driver()->hasFeature(QSqlDriver::QuerySize)) {
      temp = query.size();
} else {
     // this can be very slow
     query.last();
     temp = query.at() + 1;
}
Grüsse!
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

fast jede sqltype kann count(feldnamen / tabellen)

select count(name) FROM sqlite_master WHERE type!='meta' AND sql NOT NULL

select count(Id) FROM Adressen

gibt dann auch einen size oder null
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Beitrag von oberschlingel »

Stimmt, da hätte ich auch noch drauf kommen können! Verwende es oft zum Zählen von Einträgen, damit aber die gesamte Tabellenlänge auszulesen, hätte mir einfallen sollen.
Denn obige Lösung mit erst ans Ende hüpfen und dann den Index lesen, ist sehr sehr langsam.
Danke!
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

ich habe nun sicher 30 min.. verbracht zahlen aus der db zu holen....

erster versuch.....

Code: Alles auswählen

int get_nummer(QString incomming)
{   int nummer = 0;
    incomming.replace(QString(" "), QString("")); /* trimm */
    QString str2 = incomming;
    bool ok; 
    str2.toFloat(&ok); 
    if (ok) {
    return str2.toInt();
    }
return nummer; 
}
der erfolg!!!!

Code: Alles auswählen

int Gui_Starter::CountTable()
{
    QString tablequery ="SELECT count(name) FROM sqlite_master WHERE type!='meta' AND sql NOT NULL";
    QSqlQuery query;
    QString countstr;
    int summs = 0;
    if (is_DB_open) {
        query.exec(tablequery);
        query.first();
          if(query.value(0).toInt()>0) {
           return query.value(0).toInt();
          }
    }
return summs;
}

da ich 10 jahre mit php query auf alle moegliche tabellen machte ... muss man ernst umdenken dass alles ein typ hat im qt oder c++
Antworten