2011-09-23 3 views
2

성능상의 이유로 코드에서 많은 매개 변수화 된 쿼리를 사용하고 있습니다. 즉, 일부는 작동하지만 일부는 작동하지 않습니다.매개 변수화 된 쿼리에서 매개 변수 개수가 일치하지 않습니다.

내가 이렇게 내 데이터베이스 래퍼의 건설 중에 쿼리를 초기화 :

QString querystring = QString("SELECT somevalue FROM sometable " 
         "WHERE one_feature = :one_feature AND other_feature = :other_feature "); 
myquery = QSqlQuery(db); 
myquery.setForwardOnly(true); 
myquery.prepare(querystring); 

myquery 내 데이터베이스 래퍼의 QSqlQuery 멤버 변수입니다. 나중에,이 쿼리를 사용하고자하는 기능에, 나는

int db_wrapper::fetch_some_value (int arg1, int arg2) { 
    myquery.clear(); 
    myquery.bindValue(":one_feature", arg1); 
    myquery.bindValue(":other_feature", arg2); 

    qDebug() << "Bound values: " << myquery.boundValues(); 

    bool OK = myquery.exec(); 
    if (!OK) { 
     int number = myquery.lastError().number(); 
     qDebug() << "db error " << number; 
     qDebug() << "db error " << myquery.lastError().text(); 

#ifdef USE_EXCEPTIONS 
     throw "Could not fetch some_value!"; 
#endif 
    } 

    // process data... 
} 
뭔가를 할

나는 항상 같은 오류 메시지/출력 얻을 :

Bound values: QMap((":one_feature", QVariant(int, 1)) (":other_feature" , QVariant(int, 1))) 
db error -1 
db error " Parameter count mismatch" 
terminate called after throwing an instance of 'char const*' 

예외입니다 놀라운 일이 아니다, 그러나 매개 변수를 개수 불일치가 있습니다. boundValues에 대한 호출은 실제로 올바른 값과 모든 것을 표시하지만 여전히이 오류 메시지가 표시됩니다. 유사한 쿼리가 제대로 작동합니다.

위치 바인드 값을 대체하려고 시도했습니다. 자리 표시 자의 이름은 ?이고 위치 바인딩 값은 모두 사용하지 않았습니다. 문제가 무엇인지 알 수있는 사람이 있습니까?

나는 Qt는 4.7.3 및

+0

테이블의 필드가 int로 선언 되었습니까? 당신은 텍스트로 시도 할 수 있고 (따옴표로 묶인 문자열을 전달할 수 있습니까?) – Louis

+0

예, 필드는 ' "one_feature"정수로 선언됩니다 NOT NULL 참조 생성 SQL 스크립트에서 "feature_table"("id")'. 테이블을 변경하는 것은 불행히도 옵션이 아닙니다. 나는 또한 querystring에서 매개 변수를 인용하려고 시도했지만, 그 중 하나는 작동하지 않았다. – arne

+0

다른 사람의 이동 경로 :이 오류가 있지만 내 문제는 열 이름에 역 따옴표를 사용하지 않고 'sqlite 키워드 인 열 이름을 사용한다는 것입니다. –

답변

5

SQLite는 3.7.4-2 보통이 오류는 SELECT/UPDATE 질의 자체가 잘못된 것을 의미합니다 사용합니다. 데이터베이스의 스키마를 제공하지 않았으므로 어느 데이터베이스를 정확하게 찾을 수 없습니다. 따라서 somevalue, sometable, one_feature 또는 second_feature 중 하나 이상이 데이터베이스/테이블에 없습니다.

+0

스키마를 게시 할 수 없습니다. 죄송합니다. 그러나 SQLite 데이터베이스 브라우저에서 값 1과 1 (예에서와 같이)로 대체 된 매개 변수를 사용하여 쿼리를 실행하려고했습니다. 이것은 잘 작동합니다. – arne

+0

query.clear() 호출은 어떻습니까? 예제에서 지정하는 것입니까? prepare() 후에 호출하면 쿼리에서 제거됩니다. clear()를 호출하는 것은 일반적으로 필요하지 않습니다. –

+0

나는 아무런 효과가없는 명확하고 명확하게 시도했다. – arne