QtSql: QSqlRecord не сохраняет префиксы таблиц - PullRequest
4 голосов
/ 29 июля 2010

Я работаю над небольшим приложением в Qt и использую библиотеку SQL вместе с SQLite в качестве базы данных. Пока что это сработало хорошо. Класс QSqlQuery предоставляет только метод для получения значений столбцов по index вместо name поля . Однако с помощью функции record() текущую строку в запросе можно превратить в QSqlRecord, которая имеет функцию value() для получения значений по имени поля.

Итак, это отлично работает и позволяет мне писать более короткий и понятный код, но запрос на соединение, подобный следующему, вызывает проблемы:

SELECT t1.*, t2.* FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id

Таким образом, мы выполняем этот запрос как обычно и преобразуем строку в запись. Но оказывается, что имена столбцов в QSqlRecord не имеют префикса с именем таблицы - например, есть два столбца с именем id, которые можно найти в объекте записи. Это, очевидно, немного проблематично.

Как лучше всего решить эту проблему?

(я обнаружил эту проблему в трекере ошибок Qt, но это не сильно помогает.)

Ответы [ 2 ]

6 голосов
/ 29 июля 2010

Имя поля полностью зависит от драйвера; поэтому проблема действительно в самом SQLite, который, в конце концов, может делать «правильную» вещь (правильную, как в стандартах SQL, которые я не проверял).

В любом случае, простое решение: просто укажите для своих полей псевдоним в самом SQL, хотя вы не можете и не должны использовать select * from:

SELECT t1.id TI_ID, t1.name TI_NAME, t2.id T2_ID FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id
1 голос
/ 01 февраля 2012

Я также обнаружил эту проблему, но обнаружил, что если вы используете QSqlQueryModel для создания QSqlRecord, она работает нормально:

QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT t1.id TI_ID, t1.name TI_NAME, t2.id T2_ID FROM table1 AS t1, table2 AS t2 WHERE t1.table2_id=t2.id");

int TI_ID          = model->record(0).value("TI_ID").toInt();
int TI_ID          = model->record(0).value(0).toInt();
QString TI_NAME        = model->record(0).value("TI_NAME").toString();
QString TI_NAME_from_id= model->record(0).value(1).toString();

Вы должны получить одинаковые значения для идентификатора и имени, используя оба стиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...