2012-01-05 3 views
3

I SQLite는 다음 코드가 있습니다SQLite는 다중 삽입 첫 번째

INSERT INTO CpuUsage (NODE_ID, TIME_ID, CORE_ID, USER, NICE, SYSMODE, IDLE, IOWAIT, IRQ, SOFTIRQ, STEAL, GUEST) VALUES (1, 1, -1, 1014711, 117915, 175551, 5908257, 112996, 2613, 4359, 0, 0); INSERT INTO CpuUsage (NODE_ID, TIME_ID, CORE_ID, USER, NICE, SYSMODE, IDLE, IOWAIT, IRQ, SOFTIRQ, STEAL, GUEST) VALUES (1, 1, 0, 1014711, 117915, 175551, 5908257, 112996, 2613, 4359, 0, 0); INSERT INTO CpuUsage (NODE_ID, TIME_ID, CORE_ID, USER, NICE, SYSMODE, IDLE, IOWAIT, IRQ, SOFTIRQ, STEAL, GUEST) VALUES (1, 1, 1, 1014711, 117915, 175551, 5908257, 112996, 2613, 4359, 0, 0); 

그것은 단지를 삽입 결과 : 나는 같은 쿼리 문자열을 전달하려고하면

std::vector<std::vector<std::string> > InternalDatabaseManager::query(std::string query) 
{ 
    sqlite3_stmt *statement; 
    std::vector<std::vector<std::string> > results; 

    if(sqlite3_prepare_v2(internalDbManager, query.c_str(), -1, &statement, 0) == SQLITE_OK) 
    { 
     int cols = sqlite3_column_count(statement); 
     int result = 0; 
     while(true) 
     { 
      result = sqlite3_step(statement); 

      std::vector<std::string> values; 
      if(result == SQLITE_ROW) 
      { 
       for(int col = 0; col < cols; col++) 
       { 
        std::string s; 
        char *ptr = (char*)sqlite3_column_text(statement, col); 
        if(ptr) s = ptr; 

        values.push_back(s); 
       } 
       results.push_back(values); 
      } else 
      { 
       break; 
      } 
     } 

     sqlite3_finalize(statement); 
    } 

    std::string error = sqlite3_errmsg(internalDbManager); 
    if(error != "not an error") std::cout << query << " " << error << std::endl; 

    return results; 
} 

을 첫 삽입. 다른 툴 라이트 인 SQLiteStudio를 사용하면 괜찮습니다.

나를 도와 주실만한 아이디어가 있으십니까?

감사합니다,

페드로

편집

내 쿼리는 표준 : : 문자열입니다.

const char** pzTail; 
const char* q = query.c_str(); 

int result = -1; 
do { 
    result = sqlite3_prepare_v2(internalDbManager, q, -1, &statement, pzTail); 
    q = *pzTail; 
} 
while(result == SQLITE_OK); 

나에게 설명을 제공합니다 : 인수에 대해 '** const를 문자'에 'const를 숯불 *을'변환 할 수 없습니다 '5'INT의 sqlite3_prepare_v2 (sqlite3를의 *, const를 숯불 *, INT, sqlite3_stmt '에 * , CONST를 char *) '

답변

7

SQLite의 prepare_v2는 문자열의 첫 번째 삽입 된 문장 만 작성합니다. "팝 프론트"메커니즘으로 생각할 수 있습니다. http://www.sqlite.org/c3ref/prepare.html pzTail 다음 * pzTail가 zSql의 첫 번째 SQL 문의 끝을지나 첫 번째 바이트 를 가리 키도록 구성되어 NULL이 아닌 경우

에서

int sqlite3_prepare_v2(
    sqlite3 *db,   /* Database handle */ 
    const char *zSql,  /* SQL statement, UTF-8 encoded */ 
    int nByte,    /* Maximum length of zSql in bytes. */ 
    sqlite3_stmt **ppStmt, /* OUT: Statement handle */ 
    const char **pzTail  /* OUT: Pointer to unused portion of zSql */ 
); 

. 이러한 루틴은 만 zSql에서 첫 번째 명령문을 컴파일하므로 * pzTail은 을 가리키고 컴파일되지 않은 상태로 남아 있습니다.

pzTail 매개 변수는 나머지 삽입을 가리키며, 모든 준비가 완료 될 때까지 반복 할 수 있습니다.

다른 옵션은 처리 코드의 나머지 부분을 약간 더 단순하게 만드는 것입니다. 일반적으로입니다.

일반적으로 나는 사람들이 같은 거래하에 평가 될 것이라는 인상 아래에서 이런 종류의 일을하는 것을 보았습니다. 그러나 이것은 사실이 아닙니다. 두 번째 것은 실패하고 첫 번째와 세 번째는 여전히 성공할 것입니다.

+0

글쎄, 나는 어떤 코드를 시도했지만 좋지는 않습니다. 포인터에 문제가 있습니까? (내 편집을 참조하십시오). –

+0

@PedroDusso pzTail 인수로'query.c_str()'을 전달할 수 없습니다. ** 이중 포인터 **입니다. pzTail은 zSql 문자열의 위치를 ​​가리 킵니다. 메모리를 쓰지 않고 문자열에있는 부분 만 반환합니다. –

+0

도움을 많이 주셔서 감사합니다 ... 첫 번째 작업을하고 있지만 두 번째 반복 작업은 여전히 ​​작동하지 않지만 이것이 다른 역사라고 생각합니다 ... 감사합니다! –