Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Удаление переменных из памаяти http://www.cyberforum.ru/cpp-beginners/thread946804.html
Как удалить переменную (в классе) созданную не через new или она автамfтически удалиться при вызове delete для объекта?
C++ Вложенный класс class zer { class ins { static const string st; public: static void showIns(){ cout<<endl<<st; } }; static const string st; public: http://www.cyberforum.ru/cpp-beginners/thread946794.html
C++ GCC, ввод строки в switch
Подскажите, почему не работает? (Что именно не работает написано в комментариях кода.) Программа элементарная, специально сделал для примера. Все ведь верно, но не работает как задумано. При первой...
C++ Из заданного множества точек на плоскости выбрать такие три точки А, В, С
Из заданного множества точек на плоскости выбрать такие три точки А, В, С, чтобы внутри треугольника АВС содержалось максимальное количество точек этого множества.
C++ Бинарные файлы. Чтение http://www.cyberforum.ru/cpp-beginners/thread946625.html
Дан бинарный файл, компонентами которого являются массивы действительных чисел. Вычислить для каждого массива число отрицательных элементов. Записать в другой файл каждое из этих чисел. Как...
C++ windows 7 + win32. Как правильно сохранить проект? Как правильно сохранить проект? консольный, win32. Чтобы запускался на семерке. Не в компиляторе, а просто как приложение. Ругается на MSVCP100D.dll подробнее

Показать сообщение отдельно
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16

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

01.09.2013, 16:02. Просмотров 1862. Ответов 8
Метки (Все метки)

К программе подключена либа 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-х часов и ничего не нашел. Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.