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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt, SQLite, autoincrement  (Прочитано 6669 раз)
saim
Гость
« : Май 03, 2015, 10:00 »

Здравствуйте ! У меня возникла проблема, есть таблица базы данных с авто инкрементирующим полем , скрипт (файл с запросами,  через некий разделитель) лежит в папке , я достаю все нужные мне строки для выполнения запроса из файла парсю по разделителю , и сую это все в цикл на выполнение (см. код ниже):
Код:
// выполнение запросов полученый с файла
    QSqlQuery q("", db);
    for(int i = 0 ; i < listQuery.size (); i++)
    {
        q.exec (listQuery.at (i));
        qDebug() << "listQuery [ " << i << " ]" << q.exec(listQuery.at(i)) << "listValue= " <<listQuery.at(i) ;
    }

Скрипты для примера покажу создание таблицы и добавление в нее записей ..
Код:
// создание таблицы
 create table dic_SubTasks (id integer primary key autoincrement,name varchar(128), image BLOB, comment varchar(256), fk_task integer,
           CONSTRAINT con_1 FOREIGN KEY (fk_task) REFERENCES dic_Dictionarys(id) on update cascade on delete cascade )
Код:
//добавление  записей
insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks1' ,'' , 'comment1', 1)

insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks2' ,'' , 'comment2', 2)

insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks3' ,'' , 'comment3', 3)
Проблема  в том что если я пишу id integer primary key autoincrement - то в таблицы все записи про дублированы ... Почему ??
Если создавать так:
Код:
create table dic_Task_Network (id integer primary key, name varchar(256), image BLOB, comment varchar(256))
insert into dic_Task_Network values (1, 'Прогнозування' ,'' ,'')
insert into dic_Task_Network values (2, 'Асоціативна память','', '')
insert into dic_Task_Network values (3, 'Апроксимація', '', '')
insert into dic_Task_Network values (4, 'Розпізнавання, класифікація образів', '', '')
insert into dic_Task_Network values (5, 'Прийняття рішень управління', '', '')
insert into dic_Task_Network values (6, 'Кластерний аналіз', '','')
insert into dic_Task_Network values (7, 'Стискання відновлення даних', '','')
insert into dic_Task_Network values (8, 'Задача комівояжера', '','')
все норм !!

За ранее спасибо ! через некий разделитель) лежит в папке , я достаю все нужные мне строки для выполнения запроса из файла парсю по разделителю , и сую это все в цикл на выполнение (см. код ниже):
Код:
// выполнение запросов полученый с файла
    QSqlQuery q("", db);
    for(int i = 0 ; i < listQuery.size (); i++)
    {
        q.exec (listQuery.at (i));
        qDebug() << "listQuery [ " << i << " ]" << q.exec(listQuery.at(i)) << "listValue= " <<listQuery.at(i) ;
    }

Скрипты для примера покажу создание таблицы и добавление в нее записей ..
Код:
// создание таблицы
 create table dic_SubTasks (id integer primary key autoincrement,name varchar(128), image BLOB, comment varchar(256), fk_task integer,
           CONSTRAINT con_1 FOREIGN KEY (fk_task) REFERENCES dic_Dictionarys(id) on update cascade on delete cascade )
Код:
//добавление  записей
insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks1' ,'' , 'comment1', 1)

insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks2' ,'' , 'comment2', 2)

insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks3' ,'' , 'comment3', 3)
Проблема  в том что если я пишу id integer primary key autoincrement - то в таблицы все записи про дублированы ... Почему ??
Если создавать так:
Код:
create table dic_Task_Network (id integer primary key, name varchar(256), image BLOB, comment varchar(256))
insert into dic_Task_Network values (1, 'Прогнозування' ,'' ,'')
insert into dic_Task_Network values (2, 'Асоціативна память','', '')
insert into dic_Task_Network values (3, 'Апроксимація', '', '')
insert into dic_Task_Network values (4, 'Розпізнавання, класифікація образів', '', '')
insert into dic_Task_Network values (5, 'Прийняття рішень управління', '', '')
insert into dic_Task_Network values (6, 'Кластерний аналіз', '','')
insert into dic_Task_Network values (7, 'Стискання відновлення даних', '','')
insert into dic_Task_Network values (8, 'Задача комівояжера', '','')
все норм !!

Заранее спасибо !
« Последнее редактирование: Май 05, 2015, 19:44 от saim » Записан
saim
Гость
« Ответ #1 : Май 10, 2015, 11:05 »

Форумчане!! Ни у кого нету идей ??

С ув. Saim!
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #2 : Май 10, 2015, 11:28 »

Цитировать
// выполнение запросов полученый с файла
    QSqlQuery q("", db);
    for(int i = 0 ; i < listQuery.size (); i++)
    {
        q.exec (listQuery.at (i));
        qDebug() << "listQuery [ " << i << " ]" << q.exec(listQuery.at(i)) << "listValue= " <<listQuery.at(i) ;
    }

зачем 2 раза делать q.exec (listQuery.at (i))?
« Последнее редактирование: Май 10, 2015, 11:31 от PimenS » Записан
Bepec
Гость
« Ответ #3 : Май 10, 2015, 14:07 »

Чего то тема пролетела мимо глаз моих.

Ну во 1, при автоинкременте нужно передавать QVariant().
Во 2, вроде нужны поставить Not Null и Unique в поле индекса.
И вот тогда у вас всё должно заработать.

to PimenS - это отладочный вывод, не зависящий от происходящих в цикле действий. Следовательно данные должны быть взяты первый раз для работы внутри цикла, второй раз для дебажного вывода.

Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #4 : Май 10, 2015, 14:24 »

to PimenS - это отладочный вывод, не зависящий от происходящих в цикле действий. Следовательно данные должны быть взяты первый раз для работы внутри цикла, второй раз для дебажного вывода.
Чего? Улыбающийся
Какие данные? В цикле дважды выполняется запрос, и если это запрос на вставку записи, то будет вставляться по две записи за итерацию.
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #5 : Май 10, 2015, 15:37 »

Чего то тема пролетела мимо глаз моих.

Ну во 1, при автоинкременте нужно передавать QVariant().
Во 2, вроде нужны поставить Not Null и Unique в поле индекса.
И вот тогда у вас всё должно заработать.

to PimenS - это отладочный вывод, не зависящий от происходящих в цикле действий. Следовательно данные должны быть взяты первый раз для работы внутри цикла, второй раз для дебажного вывода.


1. При автоинкременте, в это поле вообще ничего передавать не надо, оно автоматом заполняется.
2. Автоинкремент и должен обрабатывать UNIQUE, а NOT NULL выставляется автоматом по PRIMARY KEY. (Хотя на 100% для SQLite не уверен про UNIQUE)

Для Postgresql работает

Код:
CREATE TABLE exchange.test
(
  idrow BIGSERIAL PRIMARY KEY, -- Идентификатор строки
  relname varchar NOT NULL
 
);

INSERT INTO exchange.test(relname) VALUES ('1');
INSERT INTO exchange.test(relname) VALUES ('2');

INSERT INTO exchange.test(idrow, relname) VALUES (1, '3');

ОШИБКА:  повторяющееся значение ключа нарушает ограничение уникальности "test_pkey"
DETAIL:  Ключ "(idrow)=(1)" уже существует.
********** Ошибка **********


3. Old ответил за меня.

Записан
saim
Гость
« Ответ #6 : Май 10, 2015, 20:12 »

Всем огромное СПАСИБО!!! Это моя не внимательность, прошу прощение!* Тему можно закрыть ...

Записан
Bepec
Гость
« Ответ #7 : Май 10, 2015, 23:07 »

судил по первому слову. Был неправ. Тему закрывайте сами Улыбающийся
Записан
saim
Гость
« Ответ #8 : Май 11, 2015, 10:35 »

Вопрос закрыт!)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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