Russian Qt Forum

Qt => Базы данных => Тема начата: Astrologer от Сентябрь 17, 2010, 18:55



Название: SQLite запрос
Отправлено: 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"?


Название: Re: SQLite запрос
Отправлено: crossly от Сентябрь 17, 2010, 19:06
где вы говорите его пишите??


Название: Re: SQLite запрос
Отправлено: Kolobok от Сентябрь 17, 2010, 19:13
Это два запроса.

Названия у таблиц хорошие, а главное понятные.


Название: Re: SQLite запрос
Отправлено: Denjs от Сентябрь 17, 2010, 19:15
и выполнять их надо поотдельности.
Впрочем в скулайте есть фича типа начало-конец чего-то там - типа мини-транзакции.
Я не пользовал, но похоже она позволяет несколько завпросов как один отсылать.


Название: Re: SQLite запрос
Отправлено: Astrologer от Сентябрь 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;


Название: Re: SQLite запрос
Отправлено: Kolobok от Сентябрь 17, 2010, 19:45
Не надо пачкой.

А насчет имен... Представь, что в базе будет десятка два таких таблиц. Ты же повесишься.


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


Название: Re: SQLite запрос
Отправлено: Denjs от Сентябрь 17, 2010, 20:14
Да не два десятка)) Намного больше, они у меня с именем файлов связаны. которые я загружаю. А что такого? У меня имена в QStringList хранятся, мне самому их запоминать не надо.
Просто 10 файлов грузится пару минут, если не больше. А представьте если их 1000? Вот я и хочу транзакцией  загружать.
а потом сервер базы данных упал, и те кто восстанавливал программу и данные нашли и придушили программиста  ;D
рискуете, уважаемый)  :D

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

Просто я по одному запросу исполняю за раз. Анализирую входной файл по спец-разделителям и по одному делаю.
Зато прекрасно в курсе того какой ИМЕННО запрос у меня сбойнул весь процесс. А вы в этой куче - со скудыми скулайтовскими мессадж-еггогами - не завидую я вам искать источник ошибки... где-то так 8-/


Название: Re: SQLite запрос
Отправлено: Kolobok от Сентябрь 17, 2010, 20:45
Транзакция и несколько запросов в один стринг пихать это разные вещи. А насчет ускорения insert-ов - в поиск. Обсуждалось уже.


Название: Re: SQLite запрос
Отправлено: Astrologer от Сентябрь 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. Как нибудь оптимизировать, чтобы работало быстрее не получится? Кроме пихания стрингов, которое видимо не очень хорошо работает и плохо для отладки. в голову не приходит.


Название: Re: SQLite запрос
Отправлено: Astrologer от Сентябрь 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 уничтожится при выходе? Всем огромное спасибо.


Название: Re: SQLite запрос
Отправлено: Пантер от Сентябрь 20, 2010, 15:01
Не уничтожится. Делай db.close ().


Название: Re: SQLite запрос
Отправлено: Astrologer от Сентябрь 23, 2010, 16:15
Спасибо.


Название: Re: SQLite запрос
Отправлено: Denjs от Сентябрь 27, 2010, 23:02
Транзакция и несколько запросов в один стринг пихать это разные вещи. А насчет ускорения insert-ов - в поиск. Обсуждалось уже.
я говорю не про транзакции, а про begin/end
http://habrahabr.ru/blogs/webdev/42121/
Цитировать
sqlite_query($dbhandle, 'BEGIN;');
sqlite_query($dbhandle, 'COMMIT;');


Название: Re: SQLite запрос
Отправлено: Kolobok от Сентябрь 28, 2010, 09:13
я говорю не про транзакции, а про begin/end
http://habrahabr.ru/blogs/webdev/42121/
Цитировать
sqlite_query($dbhandle, 'BEGIN;');
sqlite_query($dbhandle, 'COMMIT;');

Это и есть транзакции.:)


Название: Re: SQLite запрос
Отправлено: Denjs от Сентябрь 28, 2010, 13:29
Это и есть транзакции.:)
:-\
гы.... перечитал доки... да, это так. я решил было что раз нет указания типа transaction то и не транзакция... а вот нет)
спс .