sqlite3 Транзакция - PullRequest
       3

sqlite3 Транзакция

0 голосов
/ 03 ноября 2011

Чтобы ускорить вставку таблицы, я объединил операторы вставки (все заканчиваются точкой с запятой) в одну строку (sqlCode), которая ПОДГОТОВЛЯЕТСЯ, затем СТЕПИТ.

В моем 10000 записейтестовый файл, но только 1000 вставленных записей в таблице.

Что я делаю не так?

I знаю я должен привязать параметры к операторам вставки, но я новк этому и учиться: связанные параметры будут дальше.Кроме того, возвращаемое значение (0) сбрасывает счетчик, используемый в других местах.

Спасибо.

Франк.

int loadBloc( sqlite3 *db, char *sqlCode )
{
    int   i;
    int   rc;
    sqlite3_stmt *stmt = NULL;

    /* TRANSACT !! */
    sqlite3_exec(db, "BEGIN", 0, 0, 0);
    //printf("%d\n",strlen(sqlCode));
    rc = sqlite3_prepare_v2( db, sqlCode, -1 , &stmt, NULL );
    checkRC( db, rc,SQLITE_OK  , "Error: Failed to prepare.\n" );
    rc = sqlite3_step(stmt);
    checkRC( db, rc,SQLITE_DONE, "Error: Failed to load.\n" );
    sqlite3_exec(db, "COMMIT", 0, 0, 0);
    sqlite3_finalize(stmt);
    sqlCode[0] = '\0';
    return 0;
}

1 Ответ

0 голосов
/ 17 ноября 2011

Я бы проверил возвращаемое значение sqlite3_finalize () - он возвращает SQLITE_OK (который равен 0) или код ошибки, если таковой имеется. Поэтому, если есть какая-либо ошибка, вы поймаете ее и найдете ее объяснение в официальной документации.

Второе, что я хочу упомянуть здесь - sqlite3_exec () - это оболочка для sqlite3_prepare_v2 (), sqlite3_step () и sqlite3_finalize (). Вы вызываете его внутри другого блока sqlite3_prepare_v2 () \ sqlite3_finalize () и даже если это допустимая операция, вы фиксируете транзакцию до того, как все запросы будут завершены. Я бы попытался переместить коммит транзакции:

...
int sqlRet = sqlite3_finalize(stmt); // sqlRet will contain error code
sqlite3_exec(db, "COMMIT", 0, 0, 0);
...

Обратите внимание, что sqlite3_exec () также возвращает код ошибки в случае возникновения ошибки. Вы можете заменить ваши вызовы sqlite3_prepare_v2 (), sqlite3_step () и sqlite3_finalize () одним вызовом sqlite3_exec () и предоставлением функции обратного вызова, если это более удобно. В вашем случае (выполнение вставок) обратный вызов не требуется. 5-й параметр sqlite3_exec () может быть полезен - это сообщение об ошибке в текстовом формате.

Некоторые полезные ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...