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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
#1

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

01.09.2013, 16:02. Просмотров 1987. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2013, 16:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не могу удалить таблицы в БД SQLite (C++):

Sqlite не могу удалить дубли - Базы данных
Искал в интернете, нашел несколько вариантов, например Delete t1 FROM table1 as t1, table1 as t2 WHERE t1.name = t2.name and t1.id &lt; t2.id ...

Не могу удалить запись из таблицы - C#
Всем доброго времени суток. У меня почему то не удаляется пользователь из таблицы есть класс DAL в котором есть такой блок кода ...

Не могу удалить строку из таблицы - PHP БД
Нужно удалить полностью первую строку в таблице. Написал такой код if($g == $n) { $query1 = mysql_query(&quot;SELECT * FROM storage...

SQLite Связаные таблицы - Программирование Android
Есть таблицы Магазин и товар - Магазин как ключевая. Одну таблицу создает сразу две не хочет. class DBHelper extends...

Обновление таблицы в SQLite - C#
Всем доброго времени суток, такая проблемма: подключил базу данных SQLite, на форме расположена кнопка и DataGridView, считываю в неё...

SQLite - создание таблицы - C++ Qt
Собственно, проблема заключается в том, что не получается создать таблицу в уже открытой базе данных. Собственно метод всегда возвращает...

8
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 16:16 #2
Это скорее относится к теме SQL. Если не выполняется запрос - значит проблема либо в запросе, либо в БД. При чем тут язык С++ ?
0
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 16:20  [ТС] #3
Цитата Сообщение от castaway Посмотреть сообщение
Это скорее относится к теме SQL. Если не выполняется запрос - значит проблема либо в запросе, либо в БД. При чем тут язык С++ ?
Может быть, но я же написал, что в NaviCat все запросы выполняются без проблем, а SQLite в этом проекте встроена в приложение, и с ней что-то не так, либо я не до конца изучил некоторые аспекты работы с ней. Суть в работе функций самой либы SQLite, поэтому вопрос находится именно здесь.
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 16:34 #4
ElwooD07, можешь показать минимальный код (который не работает) удаления таблицы, и, если можно, саму таблицу как пример (тестовую или созданную в ручную).
0
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 16:36  [ТС] #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) ничего такого нет, все требования выполнены. В чем же проблема?
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 16:47 #6
Проблема в том, что ты не предоставляешь достаточной информации для решения данной проблемы.
0
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 17:27  [ТС] #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, но ничего не изменится.
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 17:34 #8
ElwooD07, так, между делом, ты создаешь UNICODE-приложение ?
0
ElwooD07
0 / 1 / 1
Регистрация: 01.02.2012
Сообщений: 16
01.09.2013, 19:25  [ТС] #9
Цитата Сообщение от castaway Посмотреть сообщение
ElwooD07, так, между делом, ты создаешь UNICODE-приложение ?
Да, база открывается с помощью sqlite3_open16, всё API sqlite для работы с текстом я использую только с суффиксом "16".
0
01.09.2013, 19:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 19:25
Привет! Вот еще темы с ответами:

Две таблицы SQLite - Lazarus
Все доброй поры суток. Хотелось бы поинтересоваться - можно ли в Lazarus работать одновременно с двумя таблицами с одной базы данных? ...

Создание таблицы в БД (SQLite) - C++ Qt
Привет всем. Почему не получается содать таблицу в бд? скопировал пример который был QSqlDatabase db =...

Запись данных в 2 таблицы SQLite - Программирование Android
Как заполнять данные в базу данных при двух таблицах? Получается лишь в одну таблицу занести данные. А как их заносить в другую?. Есть...

Суммирование ячеек таблицы sqlite - Базы данных
Добрый день! Подскажите пожалуйста один момент. Есть база данных sqlite с таблицей. В нее записываются данные :@ &quot;name&quot;, &quot;sum&quot;, &quot;itogo&quot; ....


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru