2013-04-10 3 views
2

Итак, я написал код на C++ для выбора данных из одной базы данных и INSERT в другой. В источнике db содержится более 50 000 записей. Определения таблиц для базы данных назначения являются следующие:SQLite останавливается на 252 записях

CREATE TABLE evidence_master 
(id INTEGER NOT NULL, 
    person_id TEXT NOT NULL, 
    message TEXT, 
    eid INTEGER NOT NULL, 
    frequency INTEGER, 
    string TEXT, 
    CONSTRAINT id_pk PRIMARY KEY (id), 
    CONSTRAINT eid_fk FOREIGN KEY (eid) REFERENCES evidences(eid) 
); 

CREATE TABLE evidences 
(
    eid INTEGER NOT NULL, 
    evidence_name TEXT, 
    CONSTRAINT eid_pk PRIMARY KEY (eid) 
); 

База данных источников является один здесь: http://wing.comp.nus.edu.sg/SMSCorpus/

Моя проблема в том, когда он попадает в 252-й записи, она утверждает, что она не может открыть database (EDIT: база данных назначения). Несмотря на успешную работу над 251 позицией.

Почему это может произойти?

EDIT: Вот код, который выбирает из источника:

dbOpenFail=sqlite3_open("../../../db/smscorpus.db", &dbCorpus); 
if(dbOpenFail) 
{ 
    cerr << "Can't open sms corpus: " << sqlite3_errmsg(dbCorpus); 
} 

if(sqlite3_prepare(dbCorpus, 
    queryCorpus.data(), 
    queryCorpus.length() + 1, 
    &preparedCorpusQuery, NULL) != SQLITE_OK) 
{ 
    cerr << "Failed to prepare corpus query: " << queryCorpus << zErrMsg << endl; 
    sqlite3_free(zErrMsg); 
} 
rowSelectCorpus=sqlite3_step(preparedCorpusQuery); 
while(rowSelectCorpus != SQLITE_DONE) //need to go through 51652 messages from corpus 
{ 
    if(rowSelectCorpus == SQLITE_ROW) 
    { 
     personID = sqlite3_column_text(preparedCorpusQuery, 0); //get sender ID 
     messageContent = sqlite3_column_text(preparedCorpusQuery, 1); //get message itself 
     db_entry d1(string(reinterpret_cast<const char *>(personID)), 
      string(reinterpret_cast<const char *>(messageContent))); 
     insertResult = d1.insertIntoDatabase(); 
     if(insertResult == -1) 
     { 
      return 0; //exit 
     } 

    } 
    rowSelectCorpus=sqlite3_step(preparedCorpusQuery); 
} 
+1

Как выглядит ваш код для выбора данных? – Xymostech

+0

Я отредактирую свой вопрос, чтобы добавить цикл. – muttley91

+0

Строка 252 нарушает любые ваши ограничения? –

ответ

1

Некоторые C библиотека времени выполнения имеет предел 256 открытых файлов по умолчанию обрабатывает для каждого процесса.

Очевидно, ваша программа открывает базу данных для каждой операции INSERT и забывает закрыть ее.

Необходимо открывать каждую базу данных только один раз.

+0

Я закрывал базу данных или, по крайней мере, пытался, но я не завершал свои подготовленные заявления, поэтому он фактически не закрывался должным образом , С завершающим утверждением код работает сейчас. Спасибо за указание на это! – muttley91

Смежные вопросы