Сбой SQLite при вставке элементов - PullRequest
2 голосов
/ 21 октября 2010

У меня есть три запроса, которые я выполняю через SQLite. Это то, что я бегу; первая - это объявление таблицы, а затем следующие 3 - фактические запросы.

Декларация:

"СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ элементы (busid INTEGER PRIMARY KEY, ipaddr TEXT, время TEXT DEFAULT (NOW ()));"

Запросы:

  1. (Работает) "INSERT INTO items (time, ipaddr) VALUES ('test', '192.168.1.1');"
  2. (Сбои) "INSERT INTO items (busid, ipaddr) VALUES (10, '192.168.1.1');"
  3. (Сбои) "INSERT INTO items (ipaddr) VALUES ('192.168.1.1');"

Запрос 1 работает нормально, тогда как запросы 2 и 3 вызывают сбой с помощью EXC_BAD_ACCESS в sqlite3ExprCodeTarget. Возвращаясь назад, я обнаружил, что последний пункт, к которому мой код обращается, - это оператор sqlite3_prepare_v2 (), который передает действительную базу данных / строку / и т. и, как я уже сказал, отлично работает с утверждением 1 выше, но не с 2 или 3. Что не так с этим, и как я могу это исправить? Спасибо.

РЕДАКТИРОВАТЬ 1: Чтобы уточнить, запросы 1, 2 и 3 запускаются отдельно в разных запусках программы, а не в последовательности, и база данных уничтожается между запусками, поэтому выполнение Query 1 не влияет на выполнение Query 2 после сброса.

РЕДАКТИРОВАТЬ 2: Пример исходного файла C ++ показывает проблему:

#include <iostream>
using namespace std;
#include <sqlite3.h>

int main (int argc, const char * argv[]) {

    sqlite3 *db;
    sqlite3_open("/Users/Justin/Desktop/test.db", &db);

    string createQuery = "CREATE TABLE IF NOT EXISTS items (busid INTEGER PRIMARY KEY, ipaddr TEXT, time TEXT NOT NULL DEFAULT (NOW()));";
    sqlite3_stmt *createStmt;
    cout << "Creating Table Statement" << endl;
    sqlite3_prepare_v2(db, createQuery.c_str(), createQuery.size(), &createStmt, NULL);
    cout << "Stepping Table Statement" << endl;
    if (sqlite3_step(createStmt) != SQLITE_DONE) cout << "Didn't Create Table!" << endl;

    // COMMENT OUT UNUSED ONES
    // First one works, second and third ones fail.

    string insertQuery = "INSERT INTO items (time, ipaddr) VALUES ('test', '192.168.1.1');"; // WORKS!
    //string insertQuery = "INSERT INTO items (busid, ipaddr) VALUES (10, '192.168.1.1');"; // FAILS!
    //string insertQuery = "INSERT INTO items (ipaddr) VALUES ('192.168.1.1');"; // FAILS!

    sqlite3_stmt *insertStmt;
    cout << "Creating Insert Statement" << endl;
    sqlite3_prepare_v2(db, insertQuery.c_str(), insertQuery.size(), &insertStmt, NULL);
    cout << "Stepping Insert Statement" << endl;
    if (sqlite3_step(insertStmt) != SQLITE_DONE) cout << "Didn't Insert Item!" << endl;

    cout << "Success!" << endl;
}

Просто задайте путь к базе данных в исходном коде там, где вы хотите создать тестовую базу данных.

1 Ответ

2 голосов
/ 22 октября 2010

Я скачал ваш исходный код, скомпилировал и запустил каждую строку без комментария по очереди, все работает нормально

sqlite версия 3.6.23.1

redhat 5 32 бит

так что яугадать ответ - обновить до последней версии sqlite

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