2013-04-01 5 views
0

qt 4.8과 psql 드라이버를 사용하여 postgres 9.1 데이터베이스에 연결합니다.qt는 where 문과 함께 작동하지 않습니다.

데이터베이스에 연결하고 삽입하기 위해 일반 라이브러리를 사용하고 있습니다. 거의 모든 메서드가 준비되었지만 마지막 메서드는 테이블에서 select를 수행하여 값을 다른 테이블에 삽입해야합니다. select 문을 시도 할 때 다른 동작을합니다. 코드에 따르면하지만 내가 만든 테스트 중 아무도 정확한 해결책을 찾지 못했습니다. base1.insertaEvento은 내가 ID를 추출해야합니다 이후 테이블에 데이터를 삽입 한 클래스에서 전화입니다

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; 
} 

: 다음은 내 코드입니다. The

qDebug() << enf.horaE; 

내가 올바른 방법으로 시간을 입력했는지 알기 위해 질문에 첨부했습니다. horaE는 앞서 언급 한 클래스에서 선언 한 구조체에서 가져온 것입니다.

그것이 좋은 실행 while(query.next()) 함께하지만 결과를 반환 내가 while 루프를 삭제하지만 여전히 유지하면 query.next() 컴파일러 내가 query.first를 사용하여 시도

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

를 반환으로 나는 쿼리를 실행하면() 메소드와 query.setForwardOnly (true)가 같지만 결과는 같습니다.

또한 hora_bus의 값을 qDebug()로 시도하고 psql 콘솔에서 직접 바꾸면 긍정적 인 결과가 나옵니다. 따라서 문제는 데이터가 삽입되거나 포맷 된 방식이 아니므로 쿼리가 검색 나는이 문제를 해결하는 방법을 모르지만 믿을 수 없다.

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.

데이터베이스에 대한 연결이 시간 초과되는 경우, 사용중인 변수 나 하나가 꺼집니다 : 감사

문서의 맨 끝에

답변

1

SQL 표현식 extract(epoch from horae)은 1/1/1970부터 초를 생성하므로 매개 변수 :hora_bus에 전달해야합니다.

enf.horaE이이 값을 가지고 있음을 나타내지 만, 쿼리에 ot를 전달하는 대신 문자 표현이 아마 년, 월 등의 문자열이 될 QDateTime 객체를 전달합니다. 초 수와 비교하십시오.

그래서 그 대신이 시도 :

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

은 또한 코드가 prepare()exec()의 부울 반환 값을 무시해서는 안된다. 쿼리 실행이 실패한 경우 결과 내에서 반복하지 않으려 고합니다.

EDIT1 : 참으로 때 SQL 오류 invalid input syntax for type double precisionQSqlQuery::exec() false를 반환, 당신과 비슷한 준비된 쿼리에 오늘로 설정 QDateTime을 전달합니다.

EDIT2 : 너무 다른 지원 형식으로 명시 적 캐스트가 필요하다 long로 초기화되는 지원하지 않습니다 QVariant 나타납니다. 나는 안전한 더 큰 값을 qlonglong을 선택했습니다

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

이 테스트, 그것은 나를 위해 일했습니다.

+0

시도했지만 그 다음 오류 : "오류 : 'time_t {일명 int int' '에서'const QVariant '모호합니다"변환 및 QDatetime을 전달하고 값을 확인하면 잘 작동합니다 ... –

+1

@ 크로노스 : ​​알았어. 내 편집을 봐. 하지만 여러분이 값을 확인한다고하면 postgresql이 아니라 프로그램에서 끝난 것입니다. 그 값은 예상 한 값이 아닌 SQL 매개 변수로 변환됩니다. –

0

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

은이 (가) 다음과 같은 언급 조기에 연결을 끊고 정의되지 않은 결과를 얻을 수 있습니다.

당신은 또한 당신의 기능의 대부분에 반환 값을 확인할 수 있습니다 그들은 성공했다 여부 있는지 확인하기 위해 호출합니다.

희망이 있습니다.

+0

나는 phyatt를하지만, 나는 이것을하기 전에 여기에 보여주지 않았다. QSqlDatabase db = QSqlDatabase :: addDatabase ("QPSQL"); db.setHostName (host); db.setDatabaseName (nombreBD); db.setUserName (usuario); db.setPassword (password); if (! db.open()) { cout << "데이터베이스를 열 수 없습니다."; } QSqlquery에 연결을 시작하기 위해 db를 전달한 후 그 내용을 참조하거나 무엇인가 놓치고 있습니까? –