Russian Qt Forum

Qt => Базы данных => Тема начата: andrew_121 от Май 25, 2008, 13:34



Название: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: andrew_121 от Май 25, 2008, 13:34
День добрый.
Ситуация следующая:

Создаю таблицу следующим запросом:
CREATE TABLE Prihod (GroupId INT, TovarId INT, Date QDate, Name QString, Count INT, Tsena DOUBLE)

Но при запросе:
SELECT Date, Name, Count, Tsena FROM Prihod WHERE Date < '1.6.2008'

Результат не тот что нужен. Похоже что Date возвращается не как QDate.

Подскажите в чем проблема, как исправить ?

Заранее спасибо.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 25, 2008, 14:03
В Асистенте написано, что поумолчанию Qt'я возвращает строку. Ты сам должен приводить к нужному типу.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: andrew_121 от Май 25, 2008, 14:44
Подскажите плиз, как ?

SELECT Date, Name, Count, Tsena FROM Sklad WHERE Date < '1.6.2008'

Т.е. после запроса, мне нужно приводить Date в QDate, и на основании этого, принимать решение: Подходит - Не подходит ?

А в запросе этого некак нельзя сделать ?


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 25, 2008, 14:56
читай Асистент: Навигация по результирующей выборке (http://crossplatform.ru/documentation/qtdoc4.3/qtsql.php#navigating-the-result-set)


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: andrew_121 от Май 25, 2008, 16:08
читай Асистент: Навигация по результирующей выборке (http://crossplatform.ru/documentation/qtdoc4.3/qtsql.php#navigating-the-result-set)

Прочитал.
Нечего нового не узнал.
В чем подвох ?


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 25, 2008, 16:17
Ну это просто капец какой-то, там черным по белому написано:
Цитировать
Функция QSqlQuery::value() возвращает значение типа QVariant, который может хранить значения различных типов C++ и ядра Qt, такие как int, QString и QByteArray. Различные типы значений базы данных автоматически приводятся к ближайшему эквиваленту в Qt. В предыдущем примере кода мы вызывали QVariant::toString() и QVariant::toInt(), чтобы конвертировать возвращенное значение в QString и int соответственно.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: andrew_121 от Май 25, 2008, 16:23
Ну это просто капец какой-то, там черным по белому написано:
Цитировать
Функция QSqlQuery::value() возвращает значение типа QVariant, который может хранить значения различных типов C++ и ядра Qt, такие как int, QString и QByteArray. Различные типы значений базы данных автоматически приводятся к ближайшему эквиваленту в Qt. В предыдущем примере кода мы вызывали QVariant::toString() и QVariant::toInt(), чтобы конвертировать возвращенное значение в QString и int соответственно.

Ну ешкин кот.
Вопрос в том: Можно ли SQL запросом заставить правильно понимать QDate ?


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 25, 2008, 16:29
"SQLite doesn't have a type-system like other databases, so Qt will interpret fields as strings."


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: BRE от Май 25, 2008, 16:48
Ну ешкин кот.
Вопрос в том: Можно ли SQL запросом заставить правильно понимать QDate ?
Можно.
Вопрос в том как ты формируешь строку запроса?

QSqlQuery q( "SELECT date, number FROM table WHERE date < \'" + date.toString() + "\'" );

или

QSqlQuery q;
q.prepare( "SELECT date, number FROM table WHERE date < :date" );
q.bindValue( ":date", date );

или как???


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: Вячеслав от Май 25, 2008, 17:10
возьми нормальный сервер и не компостируй себе мозг ..... sqLite не даром так назван .....
Щаз альтернатив - много ... навскидку мускул и птиц (firebird) у второго вообще прозрачно - хош embed вариант ,хош нормальный  клиент с нормальным сервером (а embed позволяет и к нормальному сервку цепляться) + возможность  писать хранимки и тригера ....
Вообщем -"мадам, Вам шашечки или ехать?" (c) не помню ;)


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: andrew_121 от Май 25, 2008, 17:21
Ну ешкин кот.
Вопрос в том: Можно ли SQL запросом заставить правильно понимать QDate ?
Можно.
Вопрос в том как ты формируешь строку запроса?

QSqlQuery q( "SELECT date, number FROM table WHERE date < \'" + date.toString() + "\'" );

или

QSqlQuery q;
q.prepare( "SELECT date, number FROM table WHERE date < :date" );
q.bindValue( ":date", date );

или как???


Первый вариант.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: BRE от Май 25, 2008, 17:23
Ну ешкин кот.
Вопрос в том: Можно ли SQL запросом заставить правильно понимать QDate ?
Можно.
Вопрос в том как ты формируешь строку запроса?

QSqlQuery q( "SELECT date, number FROM table WHERE date < \'" + date.toString() + "\'" );

или

QSqlQuery q;
q.prepare( "SELECT date, number FROM table WHERE date < :date" );
q.bindValue( ":date", date );

или как???


Первый вариант.
А откуда знаешь, что дата храниться как день.месяц.год, а не год.месяц.день например?


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: andrew_121 от Май 25, 2008, 17:28
возьми нормальный сервер и не компостируй себе мозг ..... sqLite не даром так назван .....
Щаз альтернатив - много ... навскидку мускул и птиц (firebird) у второго вообще прозрачно - хош embed вариант ,хош нормальный  клиент с нормальным сервером (а embed позволяет и к нормальному сервку цепляться) + возможность  писать хранимки и тригера ....
Вообщем -"мадам, Вам шашечки или ехать?" (c) не помню ;)

Я с базами, месяц как знаком...
И чем база от базы отличается, не знаю !!!

Можно ссылочки на рекомендуемые Вами базы, и на доки тож...

Спасибо.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: andrew_121 от Май 25, 2008, 17:32
Ну ешкин кот.
Вопрос в том: Можно ли SQL запросом заставить правильно понимать QDate ?
Можно.
Вопрос в том как ты формируешь строку запроса?

QSqlQuery q( "SELECT date, number FROM table WHERE date < \'" + date.toString() + "\'" );

или

QSqlQuery q;
q.prepare( "SELECT date, number FROM table WHERE date < :date" );
q.bindValue( ":date", date );

или как???


Первый вариант.
А откуда знаешь, что дата храниться как день.месяц.год, а не год.месяц.день например?

Ну как они расположены в базе на самом деле - незнаю!
Но выводятся как - день.месяц.год.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: BRE от Май 25, 2008, 17:34
Ну как они расположены в базе на самом деле - незнаю!
Но выводятся как - день.месяц.год.
Попробуй второй вариант...
Драйвер сам переведет дату в необходимый формат.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: andrew_121 от Май 25, 2008, 17:58
Ну как они расположены в базе на самом деле - незнаю!
Но выводятся как - день.месяц.год.
Попробуй второй вариант...
Драйвер сам переведет дату в необходимый формат.
Попробовал:
SELECT Date, Name FROM Prihod WHERE Date < :Date
Сообщает:
Parameter count mismatch


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: BRE от Май 25, 2008, 18:03
Попробовал:
SELECT Date, Name FROM Prihod WHERE Date < :Date
Сообщает:
Parameter count mismatch
Код покажи.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 25, 2008, 18:06
Цитировать
Ну как они расположены в базе на самом деле - незнаю!
Посмотреть можно с помощью %QTDIR%\demos\sqlbrowser , там же можно с запросами поэксперементировать.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 25, 2008, 21:28
Попробовал:
SELECT Date, Name FROM Prihod WHERE Date < :Date
Сообщает:
Parameter count mismatch
Код покажи.


Я посылаю запрос, используя "qsqlbrouser"


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 25, 2008, 21:31
Цитировать
Ну как они расположены в базе на самом деле - незнаю!
Посмотреть можно с помощью %QTDIR%\demos\sqlbrowser , там же можно с запросами поэксперементировать.
Оным и пользуюсь.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: Вячеслав от Май 25, 2008, 22:03
возьми нормальный сервер и не компостируй себе мозг ..... sqLite не даром так назван .....
Щаз альтернатив - много ... навскидку мускул и птиц (firebird) у второго вообще прозрачно - хош embed вариант ,хош нормальный  клиент с нормальным сервером (а embed позволяет и к нормальному сервку цепляться) + возможность  писать хранимки и тригера ....
Вообщем -"мадам, Вам шашечки или ехать?" (c) не помню ;)

Я с базами, месяц как знаком...
И чем база от базы отличается, не знаю !!!

Можно ссылочки на рекомендуемые Вами базы, и на доки тож...

Спасибо.

птиц - www.ibase.ru
мускул - http://www.mysql.ru/
по птицу можешь меня пинать ;) чем смогу- помогу .....


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: ритт от Май 25, 2008, 22:13
обязательно пинай...поможет...
мне он тоже помочь обещал /* месяца четыре назад(?) */ :)


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 25, 2008, 22:35
Оным и пользуюсь.
ты не в нем ли пыташся QDate получить?
запрос с параметром (SELECT Date, Name FROM Prihod WHERE Date < :Date) можно делать только в коде программы, а не в инструментах типа sqlbrowser


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 25, 2008, 22:47
Для приведения типа в самом запросе, не в коде программы, тебе нужен CAST, вообще есть скудноватая справка по QSQLITE на русском (http://sb-news.net/sqlite.php?page=21)


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 26, 2008, 01:29
Оным и пользуюсь.
ты не в нем ли пыташся QDate получить?
запрос с параметром (SELECT Date, Name FROM Prihod WHERE Date < :Date) можно делать только в коде программы, а не в инструментах типа sqlbrowser

Упс...спасибо...поправили.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 26, 2008, 01:32
"по птицу можешь меня пинать  чем смогу- помогу ....." - А кто такой "птиц" ? ???


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 26, 2008, 01:33
Firebird (http://www.firebirdsql.org/) (буквально "Огнная птица" или по русски "Жарптица"), наследник Interbase, но бесплатный


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 26, 2008, 11:44
Мля, а в чем разница между оными ?
И зачем их столько наплодили ?
А синтаксис запросов одинаковый ?
И какой мне порекомендуете ?


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 26, 2008, 13:17
1. Попробую в двух словах объяснить:
    * SQLite - маленькая, встраиваемая СУБД, т.е. внутри твоей программы вся логика работы СУБД. В качестве БД использует специальный файл, который можно свободно переносить с машины на машину. Применяется для хранения небольшого кол-ва данных, например настройки программ.
    * MySQL - небольшая СУБД, может работать и как встраиваемая, но обычно в режиме клиент-сервер. Используется многими сайтами для хранения настроек, авторизационную информацию. Файл БД подобен предудущей.
    * Firebird - СУБД среднего уровня, работает как клиент-сервер, достаточно быстрая расчитана на большой объем данных. На фарширована основательно возможностями.  Файл БД подобен предудущей.
    * Oracle - видимо самая матерая СУБД. Клиент-серверная. Используется при гигантских объемах данных. Файла БД как такового нет, для переноса БД требуется специальна процедура. Можно назвать стационарной.
    * PostgreSQL - некая пародия на Oracle но дармовая.
2. Цели разные.
3. Ну приблизительно, по крайней мере пока запросы простые.

4. Цель какая?


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 26, 2008, 13:31
Цель, вот какая:
Программа - типа мини клон 1С.
В базе храняться таблицы - Приходы, расходы, перемещения, уценки, реализации.
Вот для этих целей база и нужна...


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: ритт от Май 26, 2008, 14:19
2 лит-юрий,
в списке выше я бы поменял местами * мускуль и птица - т.к. мускуль и шустрее, и рассчитан на работу с бОльшими объёмами данных; * постгре и оракл - по тем же причинам...и не стал бы называть постгре "пародией"...непрофессионально как-то...

никсман, для твоих целей птиц или мускуль - самое то


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 26, 2008, 17:17
Делема мля...
Вот размышляю:
Может потратить время, и ознакомиться с FireBird ?
Или вместо запросов: SELECT Date, Name FROM Prihod WHERE Date < '1.6.2008'
использовать: SELECT Date, Name FROM Prihod и в цикле проверять условие по дате ?
Второй способ кажеться реальней, и быстрей !!!


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: BRE от Май 26, 2008, 17:37
Делема мля...
Вот размышляю:
Может потратить время, и ознакомиться с FireBird ?
Или вместо запросов: SELECT Date, Name FROM Prihod WHERE Date < '1.6.2008'
использовать: SELECT Date, Name FROM Prihod и в цикле проверять условие по дате ?
Второй способ кажеться реальней, и быстрей !!!
Не нужно делать у себя то, что может сделать база данных лучше. :)
Ради интереса, залез в SQL Browser, попробовал вот так, вроде работает:
select * from prihod where date < '01.06.2008';


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: lit-uriy от Май 26, 2008, 18:06
в принципе, я думаю проверить как вводить дату можно так:
SELECT MAX(Date) FROM Prihod
должно вернуть максимальную дату, посмотри как ее возвращает СУБД, и скорми ей в таком же формате свой запрос


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: Вячеслав от Май 26, 2008, 18:35
Делема мля...
Вот размышляю:
Может потратить время, и ознакомиться с FireBird ?
Или вместо запросов: SELECT Date, Name FROM Prihod WHERE Date < '1.6.2008'
использовать: SELECT Date, Name FROM Prihod и в цикле проверять условие по дате ?
Второй способ кажеться реальней, и быстрей !!!
1) для начала почитать доку по sql
2) прикинуть чего надо от бд
3) если приложение _не_ карманное - брать птица или мускул ( отличия между ними не в объеме хранимой инфы( кстати при больших объемах => 2Gb птиц стабильние IMHO), а в реализации движка - птиц версионник,мускул - блокировочник -> соответственно чуть разные подходы к програмированию "тяжелых" запросов
4) есть еще куча серверов БД - DB2,Informix,M$Sql,ASA и тд - выбор бааальшой - только не уподобляйся 1С с их "эротическим скринсавером" - платформой 1с ,которая якобы использует sql.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: Вячеслав от Май 26, 2008, 18:37
обязательно пинай...поможет...
мне он тоже помочь обещал /* месяца четыре назад(?) */ :)

Ну нет меня  щаз на постоянном месте обитания :( Жена уже не рычит, а грозиться прибить(начальство ;) - скоро возвернусь .....


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 26, 2008, 23:30
обязательно пинай...поможет...
мне он тоже помочь обещал /* месяца четыре назад(?) */ :)

Ну нет меня  щаз на постоянном месте обитания :( Жена уже не рычит, а грозиться прибить(начальство ;) - скоро возвернусь .....
Я ваще без жены остался...свобода !!!


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: ритт от Май 27, 2008, 01:22
самое время заняться изучением скл :)


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: niXman от Май 27, 2008, 01:57
Прога почти готова. Осталось только отчеты по датам реализовать. Нужно сдать, сроки просквозил... :-[
Потом займусь...понял что SQLITE - не лучший вариант. Потом прогу поправлю...ведь развивать придется.


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: Вячеслав от Май 27, 2008, 09:36
Хм а собственно чего править-то ? если использован raw-sql(без привязок к конкретному серверу) - то просто создаешь новую БД и правишь соединение ;)

Кстати , интересно between по датам в лайте починили ?
PS Лайт вещь хорошая когда нужно что-то очеь маааленькое,но нет желание заморачиваться с экзотикой типа rdm,bdb ... etc ....Но из-за хранения даннных в нетипизированном виде - он изначально проигрывает спецам ;)


Название: Re: Qt-4.4.0, Драйвер - QSQLITE, Проблема с QDate.
Отправлено: sergun1604 от Июнь 07, 2011, 09:43
зря вы так sqlite для настройки проги - смех
просто дело привычки привыкли работать с мускулом да с бердом так и рекомендуете
sqlite - сила
легковесная встраиваемая реляционная база данных. Исходный код библиотеки передан в общественное достояние. В 2005 году проект получил награду Google-O’Reilly Open Source Awards[2].
максимальный размер файла базы данных составляет примерно 32 ТБ (35'184'372'056'064 Б). - мало?
Простота и удобство встраивания SQLite привели к тому, что библиотека используется в браузерах, музыкальных плеерах и многих других программах.
Фреймворк Qt;
Mozilla Firefox
Mozilla Thunderbird
Skype
Многие программы поддерживают SQLite в качестве формата хранения данных
1С:Предприятие 7.7

я с датой решил так
Код:
QString data = ui->dateEdit->date().toString("yyyy-MM-dd");
strF ="INSERT INTO arhiv (data, vid, num) " "VALUES('%1', %2, %3);";        //строка значений имя цена группа
str = strF.arg(data).arg(3).arg(iddoc);
query.exec(str);
для выборки такой запрос сортировка по дате
Код:
model->setQuery("SELECT id, strftime('%d.%m.%Y', data), name, num, sumo FROM arhiv WHERE arhiv.vid=3 ORDER BY data");
все катит супер. Просто надо не ленится.
Если бы Ли́нус Бенедикт То́рвальдс не рыл так глубоко сейчас не было бы самой классной ОС линукс