2013-11-27 3 views
0

Я пытаюсь работать с QSql Relational TableModel QT. Я новичок в связи с mysql table, но все же я попытался и не могу заставить его работать должным образом в QT.Как установить связь с таблицей mysql в QT QSqlRelationalTableModel?

я могу получить результат от MySQL:

create table stu(idd int auto_increment primary key,stu_name varchar(60),stu_age int); 


create table stuInfo(idd int auto_increment primary key,stu_city varchar(60),stu_sub varchar(100), foreign key(id) references stu(id)); 

select stu.stu_name,stuInfo.stu_city from stu inner join stuInfo on stu.id=stuInfo.id; 

Для извлечения данных из MySQL:

select stu.stu_name,stuInfo.stu_city from stu inner join stuInfo on stu.id=stuInfo.id; 

В QT я не могу заставить его работать. Меня путают с setRelation() и QSqlRelation(). Я не совсем понимая, что как я могу выполнить тот же запрос в QT, я попробовал его в различных пути, но иногда я получаю пустые данные, уродливый заголовок, ошибки и т.д.

Вот мой код обучения:

model = new QSqlRelationalTableModel(); 
model->setTable("stu"); 

model->setRelation(0,QSqlRelation("stu","id","stu_name","stu_age")); 
model->setRelation(0,QSqlRelation("stuInfo","id","stu_city","stu_sub")); 
model->select(); 
ui->tableView->setModel(model); 

Мне нужна помощь, чтобы исправить мой код, пожалуйста!

+0

Мне была написана более подробная информация о моей проблеме, но stackoverflow дает столько ошибок для исправления. Поэтому я тоже вставил его на pastebin: http://pastebin.com/sX07Jknz. Спасибо за помощь! – user2715275

ответ

1

A QSqlRelation заменяет значение поля на значение другого поля в отношении, замененное поле больше не будет отображаться в запросе, поэтому вы не можете иметь 2 отношения, назначенные одному столбцу, и вы не можете назначить связь с первичным ключом (как указано в the documentation of setRelation).

В принципе, структура, для которой следует использовать QSqlRelationalTableModel, была бы основной таблицей, которая имела бы 1 или более полей иностранных индексов, и каждое из этих полей могло бы быть заменено значением выбранного поля в таблицах, из которых индексы происходят из (например: для замены числового поля «city_id» в основной таблице по имени города, исходящего из другой таблицы, для которой этот «city_id» является первичным ключом).

Для чего вы хотите использовать QSqlQueryModel с запросом, созданным вручную, вместо QSqlRelationalTableModel.

1

Проблема в том, что ваш код действительно не отражает описанную вами модель.

У вас есть первичная таблица, называемая stuInfo, которая ссылается на другую таблицу, называемую stu. Для этого в Qt, вы должны создать таблицу, основанную на «stuInfo» (а не «сту»!):

model=new QSqlRelationalTableModel(); 
    model->setTable("stuInfo"); 

Затем вы можете реализовать свой внешний ключ, как отношение:

model->setRelation(3,QSqlRelation("stu","id","stu_name")); 

вы должны указать индекс «3», что положение опорного поля «ID», на stuInfo таблице (0 будет указывать на первичный ключ, который не является тем, что вы хотите!).Параметрами QsqlRelation являются имя таблицы ссылок («stu») первичного имени поля («id») и поля ссылочной таблицы, на которое вы хотите указать: в этом случае я указываю на «stu_name»; если бы я хотел, чтобы указать на возраст, я мог бы сделать что-то вроде этого, вместо:

model->setRelation(3,QSqlRelation("stu","id","stu_age")); 

После этого кода:

model->select(); 
    ui->tableView->setModel(model); 

вы должны иметь вид, который показывает вам все поля на stuInfo и чье последнее поле («id») отображается на имя (или возраст) в таблице «stu»;

Смежные вопросы