Russian Qt Forum
Сентябрь 30, 2024, 14:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: SQLite запрос  (Прочитано 11104 раз)
Astrologer
Гость
« : Сентябрь 17, 2010, 18:55 »

Код:
СREATE TABLE d__190710_163135L ( id_d__190710_163135L integer primary key autoincrement,
INDX text,
NAME text,
MAX text,
SUMMA text,
POWER text,
MSE text);
CREATE TABLE s__190710_163135L ( id_s__190710_163135L integer primary key autoincrement,
fieldName text,
fieldType text,
fieldLength numeric,
fieldDecimals numeric);

Всем привет. Пишу данный запрос и выполняется только первая его часть. Sqlite не любит запятые или "\n"?
Записан
crossly
Гость
« Ответ #1 : Сентябрь 17, 2010, 19:06 »

где вы говорите его пишите??
Записан
Kolobok
Гость
« Ответ #2 : Сентябрь 17, 2010, 19:13 »

Это два запроса.

Названия у таблиц хорошие, а главное понятные.
Записан
Denjs
Гость
« Ответ #3 : Сентябрь 17, 2010, 19:15 »

и выполнять их надо поотдельности.
Впрочем в скулайте есть фича типа начало-конец чего-то там - типа мини-транзакции.
Я не пользовал, но похоже она позволяет несколько завпросов как один отсылать.
Записан
Astrologer
Гость
« Ответ #4 : Сентябрь 17, 2010, 19:22 »

Дело не в именах таблиц) А в том что по отдельности они выполняются, а пачкой нет. Пробовал. Вт и не могу разобраться.
Код:
void QDbfReader::sql_execute(QString query)
{
    model->setQuery(query, QSqlDatabase::database("dbfEditor"));
    align_view();
    view->setModel(model);
}

Пробовал и так исполнять:
Код:
..............................
QSqlQuery q(QSqlDatabase::database("dbfEditor"));
                q.prepare(dropQuery);
                q.exec();

                if (q.lastError().isValid())
            {
                QMessageBox::critical(this, tr("Error"), q.lastError().text());
                return;
            }

                q.prepare(createQuery);
                q.exec();


                if (q.lastError().isValid())
            {
                QMessageBox::critical(this, tr("Error"), q.lastError().text());
                return;
            }

                q.prepare(insertQuery);
                q.exec();

                if (q.lastError().isValid())
            {
                QMessageBox::critical(this, tr("Error"), q.lastError().text());
                return;
            }
..................................

Где dropQuery, createQuery и insertQuery - QString, в которых запросы через ";". Причем в этом случае вылетает ошибка - "No query. Unable to fetch row".  Непонимающий

Например dropQuery выглядит так.
Код:
DROP TABLE IF EXISTS d__190710_163547L; DROP TABLE IF EXISTS s__190710_163547L;
DROP TABLE IF EXISTS d__190710_164044L; DROP TABLE IF EXISTS s__190710_164044L;
DROP TABLE IF EXISTS d__190710_164526L; DROP TABLE IF EXISTS s__190710_164526L;
DROP TABLE IF EXISTS d__190710_165002L; DROP TABLE IF EXISTS s__190710_165002L;
DROP TABLE IF EXISTS d__190710_165407L; DROP TABLE IF EXISTS s__190710_165407L;
« Последнее редактирование: Сентябрь 17, 2010, 19:45 от Astrologer » Записан
Kolobok
Гость
« Ответ #5 : Сентябрь 17, 2010, 19:45 »

Не надо пачкой.

А насчет имен... Представь, что в базе будет десятка два таких таблиц. Ты же повесишься.
Записан
Astrologer
Гость
« Ответ #6 : Сентябрь 17, 2010, 19:51 »

Да не два десятка)) Намного больше, они у меня с именем файлов связаны. которые я загружаю. А что такого? У меня имена в QStringList хранятся, мне самому их запоминать не надо.
Просто 10 файлов грузится пару минут, если не больше. А представьте если их 1000? Вот я и хочу транзакцией  загружать.
« Последнее редактирование: Сентябрь 17, 2010, 19:55 от Astrologer » Записан
Denjs
Гость
« Ответ #7 : Сентябрь 17, 2010, 20:14 »

Да не два десятка)) Намного больше, они у меня с именем файлов связаны. которые я загружаю. А что такого? У меня имена в QStringList хранятся, мне самому их запоминать не надо.
Просто 10 файлов грузится пару минут, если не больше. А представьте если их 1000? Вот я и хочу транзакцией  загружать.
а потом сервер базы данных упал, и те кто восстанавливал программу и данные нашли и придушили программиста  Смеющийся
рискуете, уважаемый)  Веселый

Просто 10 файлов грузится пару минут, если не больше. А представьте если их 1000? Вот я и хочу транзакцией  загружать.
И в чем вопрос? вы не знаете где в сети надыбать маны на SQLite?
на домашней страничку скулайта
Поройтесь там в "SQL Syntax" или "Frequently Asked Questions".
Я уже говорил выше - Есть там как выполнять запросы пачкой))) я видел, но не уже не помню где.

Просто я по одному запросу исполняю за раз. Анализирую входной файл по спец-разделителям и по одному делаю.
Зато прекрасно в курсе того какой ИМЕННО запрос у меня сбойнул весь процесс. А вы в этой куче - со скудыми скулайтовскими мессадж-еггогами - не завидую я вам искать источник ошибки... где-то так 8-/
« Последнее редактирование: Сентябрь 17, 2010, 20:22 от Denjs » Записан
Kolobok
Гость
« Ответ #8 : Сентябрь 17, 2010, 20:45 »

Транзакция и несколько запросов в один стринг пихать это разные вещи. А насчет ускорения insert-ов - в поиск. Обсуждалось уже.
Записан
Astrologer
Гость
« Ответ #9 : Сентябрь 17, 2010, 21:05 »

Спасибо, поищу.

Код:
void openDBF(QString name)
{
...........................................................................
QSqlQuery getData(QSqlDatabase::database("dbfEditor"));

    query = "DROP TABLE IF EXISTS ";
    query += tableName;
    

    getData.prepare(query);
    getData.exec();
}

Сейчас примерно так, причем таких операций на файл - DROP, CREATE table и INSERT. Как нибудь оптимизировать, чтобы работало быстрее не получится? Кроме пихания стрингов, которое видимо не очень хорошо работает и плохо для отладки. в голову не приходит.
Записан
Astrologer
Гость
« Ответ #10 : Сентябрь 17, 2010, 21:25 »

Код:
QSqlDatabase dbase = QSqlDatabase::database("dbfEditor");
    dbase.setDatabaseName(dbFile);
    if (!dbase.open())
        {
        QMessageBox::warning(0, QString::fromLocal8Bit("Ошибка"),
        QString::fromLocal8Bit("Ошибка при подключении к базе данных %1.").arg(dbFile));
            return;
        }

    dbase.transaction();

    QSqlQuery getData(dbase);

//here go queries
............

    dbase.commit();

Быстрее на порядок. Можно считать вопрос закрытым. За исключением - dbase уничтожится при выходе? Всем огромное спасибо.
« Последнее редактирование: Сентябрь 17, 2010, 21:33 от Astrologer » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Сентябрь 20, 2010, 15:01 »

Не уничтожится. Делай db.close ().
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Astrologer
Гость
« Ответ #12 : Сентябрь 23, 2010, 16:15 »

Спасибо.
Записан
Denjs
Гость
« Ответ #13 : Сентябрь 27, 2010, 23:02 »

Транзакция и несколько запросов в один стринг пихать это разные вещи. А насчет ускорения insert-ов - в поиск. Обсуждалось уже.
я говорю не про транзакции, а про begin/end
http://habrahabr.ru/blogs/webdev/42121/
Цитировать
sqlite_query($dbhandle, 'BEGIN;');
sqlite_query($dbhandle, 'COMMIT;');
Записан
Kolobok
Гость
« Ответ #14 : Сентябрь 28, 2010, 09:13 »

я говорю не про транзакции, а про begin/end
http://habrahabr.ru/blogs/webdev/42121/
Цитировать
sqlite_query($dbhandle, 'BEGIN;');
sqlite_query($dbhandle, 'COMMIT;');

Это и есть транзакции.Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.