Russian Qt Forum

Qt => Базы данных => Тема начата: AlphaGh0St от Сентября 12, 2011, 17:16



Название: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Сентября 12, 2011, 17:16
Всем привет! Пишу локальную базу данных и столкнулся с рядом вопросов.

Например, пользователь жмёт на кнопку "Добавить", заполняет окно вставки и добавляет новую запись в таблицу. Подскажите, как обновить Table View, чтобы он сразу отображал новые данные?

Нашёл вот такое http://www.prog.org.ru/topic_9086_0.html (http://www.prog.org.ru/topic_9086_0.html) решение, но хотелось бы реализовать обновление проще. Без наследования от модели.


Название: Re: Создание локальной БД. Проблема.
Отправлено: lit-uriy от Сентября 12, 2011, 17:23
дёргать в модели select(), чтобы она прочитала данные из БД


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Сентября 12, 2011, 19:54
Замечательно, всё заработало! Спасибо!


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Сентября 18, 2011, 14:55
Возник следующий вопрос: кол-во строк в таблице БД можно динамически изменять (добавлять, удалять строки).
А возможно ли динамически (во время работы программы) изменять кол-во столбцов?
И если это всё же как-то возможно, подскажите, как именно?


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Сентября 19, 2011, 08:46
ALTER TABLE


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Сентября 23, 2011, 10:40
Замечательная возможность ))
Я не особо с SQL знаком, новичок, короче.

Добавить столбец у меня получилось:
Код:
ALTER TABLE mainTable ADD col1 NUMERIC

А вот удалить что-то не получается... Пробовал такой запрос:
Код:
ALTER TABLE mainTable DROP COLUMN col1;

И такой:
Код:
ALTER TABLE mainTable DROP col1;

Отладочная информация дала следующее:
Код:
SQL   ->  "ALTER TABLE mainTable DROP COLUMN col1;"
ERROR ->  "near "DROP": syntax error Unable to execute statement"

Пробовал установить пустую несуществующую таблицу на время выполнения запроса:
Код:
tableModel->setTable("");
execSQLQuery("ALTER TABLE mainTable DROP COLUMN col1;");
tableModel->setTable("mainTable");
Тоже не помогло...

Подскажите, в чём ошибка? И как правильно удалить столбец?


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Сентября 23, 2011, 11:00
Учи SQL. ALTER - добавление. А дропнуть поле я уже не помню как. Но можно всегда создать другую таблицу без него, скопировать туда данные и заменить исходную таблицу на полученную.


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Сентября 23, 2011, 11:19
Походу учу.

Информация взята от сюда: http://www.w3schools.com/sql/sql_alter.asp (http://www.w3schools.com/sql/sql_alter.asp)

Вот пример:
Цитировать
DROP COLUMN Example

Next, we want to delete the column named "DateOfBirth" in the "Persons" table.

We use the following SQL statement:
Код:
ALTER TABLE Persons DROP COLUMN DateOfBirth

Цитировать
Но можно всегда создать другую таблицу без него, скопировать туда данные и заменить исходную таблицу на полученную.
Идея хорошая. Но хотелось бы разобраться именно с удалением столбца.


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Сентября 23, 2011, 11:34
Хм. Извиняюсь. Это уже я забыл sql. :) Попробуй этот запрос выполнить через стороннюю прогу. А может твоя БД и не поддерживает этого...


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Сентября 23, 2011, 11:44
Файл БД создал через программу SQLite Database Browser v. 2.0b1.
Пробовал в самом SQLite браузере выполнить такой запрос, так браузер завис)))

Может и правда не поддерживается, уж не знаю, что и делать...
Подскажите, как создать файл локальной БД, чтобы он поддерживал дроп (через какую программу, какую именно БД)?


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Сентября 23, 2011, 11:47
Не забывай про гугл. ;)

http://www.sqlite.org/faq.html (http://www.sqlite.org/faq.html)
Цитировать
(11) How do I add or delete columns from an existing table in SQLite.

SQLite has limited ALTER TABLE support that you can use to add a column to the end of a table or to change the name of a table. If you want to make more complex changes in the structure of a table, you will have to recreate the table. You can save existing data to a temporary table, drop the old table, create the new table, then copy the data back in from the temporary table.

For example, suppose you have a table named "t1" with columns names "a", "b", and "c" and that you want to delete column "c" from this table. The following steps illustrate how this could be done:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Сентября 23, 2011, 11:49
Подскажите, как создать файл локальной БД, чтобы он поддерживал дроп (через какую программу, какую именно БД)?
Можешь посмотреть в сторону Firebird embedded - она намного понавароченнее, чем SQLite.


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Сентября 23, 2011, 12:20
Хорошо, буду разбираться. Спасибо!


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Сентября 23, 2011, 12:40
Подскажите, а как получить имя столбца?
Пусть в таблице последний столбец носит имя col1. Как получить его имя для дальнейшего сохранения в строковую переменную?


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Сентября 23, 2011, 12:45
Можно попробовать через QSqlRecord. А лучше поищи инфу по системным таблицам в SQLite.


Название: Re: Создание локальной БД. Проблема.
Отправлено: Rem Norton от Сентября 23, 2011, 12:48
Код
C++ (Qt)
QString QSqlRecord::fieldName ( int index ) const
 


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Сентября 23, 2011, 12:50
Это только в том случае, если сами поля приходят в правильном порядке.


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Октября 06, 2011, 19:30
Моя идея с добавлением столбцов оказалась полной лажей.
Благо, что я это понял ещё на этапе проектирования, а не на этапе реализации ))

В общем тут так всё очень хитро закручено, думаю, лучше, если я сразу всё расскажу.
Необходимо реализовать базу данных учёта товаров для магазина.
Таблица БД должна выглядеть следующим образом...

Обычные столбцы не вызывают никаких проблем. Вся проблема и заморочка с датами. В поле, именуемом текущей датой пишется кол-во проданного товара в этот день. Например, в данной таблице видно, что:
Товар1 был продан в кол-ве одна штука 5-го числа и одна штука 6-го числа.
Товар2 не был продан 5-го числа, но 6-го числа был продан товар2 в кол-ве 2шт.
Товар3 не был продан в эти дни.

Наименование товараКол-воЦенаСумма5.106.10
товар1240080011
товар236001800 2
товар344001600

Вся трудность возникает с датами. Хотя, возможно, трудностей здесь вообще нет, просто я смотрю на проблему "не под тем углом".
Подскажите, как лучше всего/правильно реализовать такую БД?


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Октября 06, 2011, 21:04
Отдельная таблица, где будет код товара и дата, когда он продан.


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Октября 06, 2011, 21:08
Я в БД не очень-то разбираюсь, новичок, короче.
Учить всю теорию баз данных ради одной задачи - откровенно лень.

Не могли бы вы подробнее разъяснить, как это сделать (как это будет выглядеть) или подскажите документацию, для решения этой задачи.


Название: Re: Создание локальной БД. Проблема.
Отправлено: Пантер от Октября 06, 2011, 21:15
Ох, если бы я еще помнил. :) Сейчас попробую псевдокодом
ТаблицаТовров
  УникальныйНомер
  Наименование
  Цена

ТаблицаПродаж
  УникальныйНомер
  СсылкаНаНомерВТаблицеТоваров
  Дата
  Количество
  Сумма

Типа того. Гугли про внешние ключи.


Название: Re: Создание локальной БД. Проблема.
Отправлено: andrew.k от Октября 07, 2011, 00:05
В любой книге по SQL будет пример именно с товарами.


Название: Re: Создание локальной БД. Проблема.
Отправлено: AlphaGh0St от Октября 07, 2011, 11:22
В любой книге по SQL будет пример именно с товарами.

Книг много, можете подсказать что-то конкретное?


Название: Re: Создание локальной БД. Проблема.
Отправлено: andrew.k от Октября 07, 2011, 13:12
Совершенно любая (http://lmgtfy.com/?q=sql+%D0%B4%D0%BB%D1%8F+%D1%87%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C) книга подойдет.

Какие ты уже попробовал и тебе не помогли?