2013-04-01 102 views
0

我正在使用qt 4.8和psql驅動程序連接到postgres 9.1數據庫。qt選擇不與where語句工作

我正在做一個通用庫來連接並插入數據庫;幾乎所有方法都已準備就緒,但在最後一個方法中,我需要從表中進行選擇以將值插入另一個表中。當我嘗試select語句時,它的行爲有所不同。根據代碼反過來,但沒有一個我做的測試導致了一個正確的解決方案。 這裏是我的代碼:

struct enfriadores enf; 
enf.horaE=time(&enf.horaE); 
enf.horaS=time(&enf.horaS)+1900; 

    //base1.insertaEvento(db,enf); 

QString consulta = "Select id_evento from eventos where extract(epoch from horae)=:hora_bus"; 

QDateTime hora_bus(QDateTime::fromTime_t(enf.horaE)); 

//qDebug()<< enf.horaE; 

QSqlQuery query(db); 
query.prepare(consulta);            
query.bindValue(":hora_bus",hora_bus); 
query.exec(); 
query.first(); 

while(query.next()) 
{ 

    int valor = query.value(0).toInt(); 
    qDebug() << valor << endl; 
} 

的base1.insertaEvento是一類我也插在哪裏之後,我需要提取ID表數據的調用。

qDebug() << enf.horaE; 

我把它知道,如果時間是正確的形式之前,我把它附加到查詢,順便說一句,是正確的。 horaE取自我在前面提到的類中聲明的結構。

當我運行查詢,因爲它與它運行良好的while(query.next())但返回任何結果,如果我刪除了while循環,但仍維持query.next()編譯器返回

QSqlQuery::value: not positioned on a valid record 
0 

我使用query.first嘗試()方法和query.setForwardOnly(true),但結果相同。

另外,如果我用qDebug()嘗試hora_bus的值並直接在psql控制檯中替換它,我會得到一個肯定的匹配,所以問題不在於數據插入或格式化的方式,而是查詢的方式檢索我相信但不知道如何解決這個 任何想法? 感謝

回答

1

SQL表達式extract(epoch from horae)產生自1970年1月1日以來的秒數,所以這應該傳遞給參數:hora_bus

QDateTime::fromTime_t(enf.horaE)表明enf.horaE有這個價值,但是的而不是傳遞加時賽查詢,它傳遞一個QDateTime對象,其文本表示很可能將與年,月,等字符串...這不能比較幾秒鐘。

那麼試試這個來代替:

query.bindValue(":hora_bus",enf.horaE); 

而且代碼不應該忽視的prepare()exec()布爾返回值。查詢執行失敗時,您不希望在結果中嘗試循環。

EDIT1: 的確,當傳遞QDateTime設置爲今天與你相似,QSqlQuery::exec()返回false與SQL錯誤invalid input syntax for type double precision一個準備好的查詢。

EDIT2:看來QVariant不支持與long被初始化,顯式類型轉換到不同類型的支持是必要的。我選擇qlonglong一個安全的較大值:

query.bindValue(":hora_bus",(qlonglong)enf.horaE); 

測試,它爲我工作。

+0

試過,但我得到了下一個錯誤: 「錯誤:從'time_t {aka long int}'轉換爲'const QVariant'是不明確的」,如果我通過QDatetime並檢查它的值,它可以正常工作... –

+1

@克羅諾斯:好的,看我的編輯。但是當你說你檢查它的值是在你的程序中完成的,而不是在postgresql中。這曾經被轉換爲一個SQL參數,該值並非您所期望的。 –

0

http://qt-project.org/doc/qt-4.8/qsqlquery.html#details

在文檔的最後它提到以下幾點:

Warning: You must load the SQL driver and open the connection before a QSqlQuery is created. Also, the connection must remain open while the query exists; otherwise, the behavior of QSqlQuery is undefined.

如果與數據庫的連接超時,您使用的變量或一個熄滅的範圍,您可能會斷開連接並獲取未定義的結果。

您還可以檢查大部分函數調用的返回值,以查看它們是否成功。

希望有所幫助。

+0

我做phyatt,但我沒有表現出來,在此之前,我這樣做: QSqlDatabase db = QSqlDatabase :: addDatabase(「QPSQL」); db.setHostName(host); db.setDatabaseName(nombreBD); db.setUserName(usuario); db.setPassword(password); (!db.open()) cout <<「數據庫不能打開」; } 之後,我通過數據庫到QSqlquery開始連接,是你指的是或我錯過了什麼? –