2012-07-18 4 views
1

내 개체에서 중복 sqlite 코드를 줄이려고합니다. 이렇게하려면 sqlite 상호 작용이 있고 sqlite3_stmt를 반환하는 메서드가 필요했습니다. 내 문제는 sqlite3_stmt 포인터가 항상 null입니다. 내 질문은, 내가 뭔가 잘못하고있는 또는 sqlite 함께 할 수 있습니까?C++을 사용하면 메서드에서 sqlite3_stmt를 반환 할 수 있습니까?

사용법 :

SqliteIO sqldb; 
string GET_CONFIG = "select* from config; "; 
sqlite3_stmt *statement; 
assert(sqldb.sqlForResults(GET_CONFIG, statement)); 
assert(statement != NULL); //this fails 

방법 :

bool SqliteIO::sqlForResults(string pSql, sqlite3_stmt *statement){ 
bool lbRetVal=false; 

if(mDB == NULL){ 
    cerr << "No database to query"; 
    Logger::error("SqlliteIO::getAllScheuled() null database handle"); 
} else { 
    sqlite3_busy_timeout(mDB, 2000); 
    if(sqlite3_prepare_v2(mDB, pSql.c_str(), -1, &statement, 0) == SQLITE_OK) { 
     lbRetVal = true; 
    } 
    string error = sqlite3_errmsg(mDB); 
    if(error != "not an error"){ 
     cerr << pSql << " " << error << endl; 
     Logger::error("SqlliteIO::sqlForResults() "+ error + " " +pSql ); 
    } 
} 
return lbRetVal; 

답변

1
sqlite3_stmt *statement; // this never gets initialized 
assert(sqldb.sqlForResults(GET_CONFIG, statement)); 
assert(statement != NULL); //this fails 

결코 (당신이) (sqlForResults에의 사본을 통과하지거야)하여 초기화됩니다 코드 블록에서 문 변수 . 솔직히

, 당신은 문이 어떤 쓰레기 값을 가질 수 있기 때문에 SqliteIO의

+0

이 정말 질문에 대답하지 않습니다. null로 초기화 된 경우에도 여전히 메소드에서 결과 세트를 얻지 못합니다. – Jim

+0

어때? 진술은 결코 아무것도 설정되지 않습니다! sqlForResults 내부에서 'statement'매개 변수는 무언가로 설정되지만 다른 스택 프레임의 'statement'변수에는 영향을 미치지 않습니다. 이를 수행하려면 참조 또는 포인터 포인터로 전달해야합니다. – Bwmat

0

문 매개 변수 (나는 당신의 컴파일러 디버그 모드에서 0으로 초기화되는 변수를 추측하고있어) 그 주장이 실패 운이 좋다 :: sqlForResults() 형식이 sqlite3_stmt**이어야하며 sqlite3_stmt*이 아니어야합니다. 그래서 전화 사이트는 지금과 같습니다없이

SqliteIO sqldb; 
string GET_CONFIG = "select* from config; "; 
sqlite3_stmt *statement = NULL; 
assert(sqldb.sqlForResults(GET_CONFIG, &statement)); 

참조/운영자 & 주소의 문 앞에 있던, 당신은 sqlForResultsstatement 전달 될 것이다 (원래의 질문에 같은) 이 경우 NULL 또는 0입니다.

bool SqliteIO::sqlForResults(string pSql, sqlite3_stmt **statement){ 
bool lbRetVal=false; 

if(mDB == NULL){ 
    // ... 
} else { 
    // ... 
    if(sqlite3_prepare_v2(mDB, pSql.c_str(), -1, statement, 0) == SQLITE_OK) { 
     // ... 
    } 
    // ... 
} 
return lbRetVal; 

매개 변수 목록이 이제 sqlite_stmt** 인수를 받아, 우리는 sqlite3_prepare_v2에 직접적 전달합니다 sqlForResults의 관련 변경입니다. 원래의 질문에서 sqlForResults은 을 sqlite3_prepare_v2으로 전달했습니다. 이는이 SqliteIO::sqlForResults 메서드 호출에 대한 statement 매개 변수의 주소입니다. 원하는 것은 아닙니다.

나는 이것이 오래된 질문이라는 것을 알고 있지만 이것이 도움이되기를 바랍니다.

편집 : sqlForResults에서 좀 더 코드를 회피하는 명확성과

관련 문제