Форум программистов, компьютерный форум CyberForum.ru

Не могу удалить таблицы в БД SQLite - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 16:02     Не могу удалить таблицы в БД SQLite #1
К программе подключена либа SQLite для реализации небольшого хранилища данных. Иногда это хранилище надо очищать. Так вот, я столкнулся с проблемой удаления таблиц из базы: после выполнения
SQL
1
DROP TABLE IF EXISTS 'table'
таблица как была, так и остается в базе. Уже ознакомился с VACUUM и режимом aut_vacuum: пробовал и то, и другое - ничего не помогает.
Также пробовал стереть данные из таблицы перед её удалением
SQL
1
DELETE FROM 'table'; DROP TABLE IF EXISTS 'table'
, но SQLite возвращает SQLITE_ERROR. В документации написано: "SQL error or missing database". База существует, и другие запросы через указатель на неё выполнить можно, а этот - нельзя. Что самое интересное, в NaviCat этот запрос выполняется без проблем.
Вот кусок кода, в котором происходят проблемы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const int tables_count = 3;
std::wstring tables[tables_count] = 
{ L"Sets", L"Files", L"Others" };
DBCErr ret = SUCCESS;
SQLQuery query(db, L"DELETE FROM '?'; DROP TABLE IF EXISTS '?';");
ret = query.LastErr();
if (ret != SUCCESS)
    return ret;
for(int i = 0; i < tables_count; ++i)
{
    query.BindText(tables[i], 1);
    query.BindText(tables[i], 2);
    ret = query.Step();
    if (ret == SUCCESS)
        ret = query.Step();
    if (ret != SUCCESS)
        return ret;
}
query.Prepare(L"VACUUM");
ret = query.Step();
return ret;
Здесь SQLQuery - мой класс для реализации запросов. Его методы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
DBCErr SQLQuery::ConvertToDBCErr(int sqlite_err_code)
{
    switch(sqlite_err_code)
    {
    case SQLITE_OK:
    case SQLITE_DONE:
        return SUCCESS;
    case SQLITE_ROW:
        return SQL_ROW;
    // ............................... //
    
    default:
        return SQL_ERROR;
    }
}
 
SQLQuery::SQLQuery(sqlite3 * db, const std::wstring &query):
    m_stmt(0), m_last_err(SQLITE_OK), m_last_dbcerr(SUCCESS)
{
    if (db)
        m_db = db;
    else
        throw std::exception("DB was disconnected");
    if (!query.empty())
        m_last_err = sqlite3_prepare16_v2(db, query.c_str(),
        query.size() * sizeof(wchar_t), &m_stmt, 0);
    m_last_dbcerr = ConvertToDBCErr(m_last_err);
}
 
DBCErr SQLQuery::Prepare(const std::wstring &new_query)
{
    if (m_stmt)
        sqlite3_reset(m_stmt);
    m_last_err = sqlite3_prepare16_v2(m_db, new_query.c_str(),
        new_query.size() * sizeof(wchar_t), &m_stmt, 0);
    m_last_dbcerr =
        ConvertToDBCErr(m_last_err);
    return m_last_dbcerr;
}
 
DBCErr SQLQuery::BindText(const std::wstring &value, int column)
{
    if (!m_stmt)
        return SQL_STMT_NOT_PREPARED;
    m_last_err = sqlite3_bind_text16(m_stmt, column,
        value.c_str(), value.length() * sizeof(wchar_t), 0);
    m_last_dbcerr = ConvertToDBCErr(m_last_err);
    return m_last_dbcerr;
}
 
DBCErr SQLQuery::Step()
{
    if (!m_stmt)
        return SQL_STMT_NOT_PREPARED;
    m_last_err = sqlite3_step(m_stmt);
    m_last_dbcerr =
        ConvertToDBCErr(m_last_err);
    return m_last_dbcerr;
}
 
DBCErr SQLQuery::Reset()
{
    if (m_stmt)
        m_last_err = sqlite3_reset(m_stmt);
    else
        m_last_err = SQLITE_OK;
    m_last_dbcerr =
        ConvertToDBCErr(m_last_err);
    return m_last_dbcerr;
}
 
DBCErr SQLQuery::LastErr() const
{
    return m_last_dbcerr;
}
Наперед скажу, что с реализацией SQLQuery у меня никогда проблем не возникало.
Очень прошу помощи, так как сижу над проблемой уже около 4-х часов и ничего не нашел. Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2013, 16:02     Не могу удалить таблицы в БД SQLite
Посмотрите здесь:

C++ Не могу удалить динамически выделенную память под массив
SQLite Блокровка/разблокировка C++
Не могу удалить из вектора C++
Vector и Select SQLite C++
Начать работать с SQLite C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 16:16     Не могу удалить таблицы в БД SQLite #2
Это скорее относится к теме SQL. Если не выполняется запрос - значит проблема либо в запросе, либо в БД. При чем тут язык С++ ?
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 16:20  [ТС]     Не могу удалить таблицы в БД SQLite #3
Цитата Сообщение от castaway Посмотреть сообщение
Это скорее относится к теме SQL. Если не выполняется запрос - значит проблема либо в запросе, либо в БД. При чем тут язык С++ ?
Может быть, но я же написал, что в NaviCat все запросы выполняются без проблем, а SQLite в этом проекте встроена в приложение, и с ней что-то не так, либо я не до конца изучил некоторые аспекты работы с ней. Суть в работе функций самой либы SQLite, поэтому вопрос находится именно здесь.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 16:34     Не могу удалить таблицы в БД SQLite #4
ElwooD07, можешь показать минимальный код (который не работает) удаления таблицы, и, если можно, саму таблицу как пример (тестовую или созданную в ручную).
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 16:36  [ТС]     Не могу удалить таблицы в БД SQLite #5
Upd:

Запросы прокатывают, если выполнять их "в лапу", без использования bind, т.е., например:
SQL
1
DELETE FROM Sets
вместо
SQL
1
DELETE FROM ?
с последующим
C++
1
sqlite3_bind_text16(stmt, 1, L"Sets", -1, 0)
успешно очищает таблицу.
В документации по sqlite3_3_bind_* (http://www.sqlite.org/c3ref/bind_blob.html) ничего такого нет, все требования выполнены. В чем же проблема?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 16:47     Не могу удалить таблицы в БД SQLite #6
Проблема в том, что ты не предоставляешь достаточной информации для решения данной проблемы.
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 17:27  [ТС]     Не могу удалить таблицы в БД SQLite #7
Цитата Сообщение от castaway Посмотреть сообщение
Проблема в том, что ты не предоставляешь достаточной информации для решения данной проблемы.
Таблица создается запросом:
SQL
1
"CREATE TABLE Sets(id INTEGER PRIMARY KEY NOT NULL, bin_path TEXT, password_hash TEXT, path_sep INTEGER);"
Код, который не работает:
(Здесь m_db - указатель на базу, созданный заранее, т.е. база уже в коннекте с программой):
C++
1
2
3
4
5
6
7
8
sqlite3_stmt * m_stmt = 0;
 
sqlite3_prepare16_v2(m_db, L"DELETE FROM ?; DROP TABLE IF EXISTS ?;",
    -1, &m_stmt, 0);
sqlite3_bind_text16(m_stmt, 1, L"Sets", -1, 0);
sqlite3_bind_text16(m_stmt, 2, L"Sets", -1, 0);
sqlite3_step(m_stmt);
sqlite3_step(m_stmt);
Код, который работает (частично):
C++
1
2
3
4
5
6
sqlite3_stmt * m_stmt = 0;
 
sqlite3_prepare16_v2(m_db, L"DELETE FROM Sets; DROP TABLE IF EXISTS Sets;",
    -1, &m_stmt, 0);
sqlite3_step(m_stmt);
sqlite3_step(m_stmt);
Второй кусок (который работает), возвращает SQLITE_OK после второго sqlite3_step(), но таблица при этом не удаляется . Работает хотя бы
SQL
1
DELETE FROM Sets
, спасибо sqlite хоть на этом...

В коде, который работает, в комманде sqlite3_bind_text16() 4-й параметр - длина строки в байтах. Можно установить 8, но ничего не изменится.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 17:34     Не могу удалить таблицы в БД SQLite #8
ElwooD07, так, между делом, ты создаешь UNICODE-приложение ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 19:25     Не могу удалить таблицы в БД SQLite
Еще ссылки по теме:

C++ Не могу найти ошибку. Хеш-таблицы
C++ Работа с SQLite
Vector allocator SQLite C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 19:25  [ТС]     Не могу удалить таблицы в БД SQLite #9
Цитата Сообщение от castaway Посмотреть сообщение
ElwooD07, так, между делом, ты создаешь UNICODE-приложение ?
Да, база открывается с помощью sqlite3_open16, всё API sqlite для работы с текстом я использую только с суффиксом "16".
Yandex
Объявления
01.09.2013, 19:25     Не могу удалить таблицы в БД SQLite
Ответ Создать тему
Опции темы

Текущее время: 01:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru