Код просто должен сообщить вызывающей стороне, есть ли path
в таблице или нет. Приведенный ниже код С++ делает это правильно, используя select count(*)
и sqlite3_get_table
, но только на короткое время, а затем умирает. Очевидно, есть проблемы с sqlite3_get_table. здесь есть очень похожий вопрос, но я не понимаю, как применить этот ответ к моей проблеме. Я прочитал документы sqlite и прошел учебник по sqlite. Я использовал sqlite3_exec для инициализации базы данных и вставки новых записей, но опять же, не вижу, как написать надежный метод С++, который просто возвращает логическое значение, если он находит или не находит совпадение в таблице. Как я уже сказал, приведенный ниже код работает, но не более чем на несколько сотен вызовов. Разве это не должно быть одной из самых простых вещей, которые можно сделать с базой данных? Есть ли какие-нибудь простые примеры того, как это сделать, или предложения о том, как лучше всего решить эту проблему?
bool ifFound(string path) {
if (turn_off) return false;
char **result;
int nrow = 0; // Number of result rows
int ncol = 0; // Number of result columns
char * zErrMsg = 0; // Error message
if (SQLITE_OK != sqlite3_open(database_path.c_str(), &db)) {
coutError(__FILE__, __LINE__, "Can't open database " + database_path);
return false;
}
int count = 0;
string sqlCommand = "select count(*) from my_table where path='"+path+"'";
if (SQLITE_OK ==
sqlite3_get_table(db, sqlCommand.c_str(),&result,&nrow,&ncol,&zErrMsg))
count = atoi(result[ncol]);
else coutError(__FILE__, __LINE__, sqlCommand + " " + zErrMsg);
sqlite3_free_table(result);
sqlite3_close(db);
return (count != 0);
}