![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Steklova Olga |
![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет!
![]() Есть у меня две таблицы БД: T1 и T2, в каждой есть поля ID INTEGER (PK, автоинкрементное) и PARAM FLOAT. Для работы с таблицами использую QSqlTableModel и QTableView. Во время работы программы в таблицу T1 записи только добавляются. Организую заполнение и просмотр следующим образом: - при поступлении первой записи добавляю ее в таблицу БД, выполняю select для модели, первую строку таблицы делаю текущей, запоминаю соотв. значение ID, - при поступлении следующей записи добавляю ее в таблицу БД, выполняю select для модели, строку с запомненным ID делаю текущей, делаю скроллинг отображения для обеспечения видимости текущей строки, - при изменении текущей строки оператором запоминаю значение ID. Тут все OK. А вот с таблицей T2 посложнее... Во время работы программы, периодически (вероятно, не чаще, чем 1 раз в 5 сек), для занесения в таблицу T2 приходит сразу целый массив записей (размер массива - от одной до 200 записей). Мне надо хранить в БД данные только последнего массива. Данные разных массивов: - могут полностью совпадать, - могут отличаться всеми значениями, - могут отличаться несколькими значениями, - могут отличаться количеством значений. Организую заполнение и просмотр следующим образом: - при поступлении первого массива добавляю поступившие записи в таблицу БД, выполняю select для модели, первую строку таблицы делаю текущей, - при поступлении следующего массива удаляю все записи из таблицы БД, добавляю поступившие записи в таблицу БД, выполняю select для модели, первую строку таблицы делаю текущей (пока так). Как здесь просматривать таблицу с запоминанием и выделением текущей строки? 1) Запоминать ID текущей строки? Здесь это не поможет, так как поле автоинкрементное. 2) Сделать поле ID не автоинкрементным, не удалять предыдущий массив и добавлять новый, а обновлять массив? Этот вариант мне совсем не нравится, по-моему, он очень сложный. 3) Запоминать PARAM текущей строки, а при поступлении следующего массива искать в нем запись с запомненным PARAM и делать ее текущей? А если такая не найдется, то делать текущей первую. Но для этого придется сравнивать значения типа FLOAT, видимо используя какую-то точность сравнения. Или так и надо? ![]() Других вариантов не придумала. У кого какие мысли есть по этому поводу? Спасибо. |
|
|
![]() |
Steklova Olga |
![]()
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
09.02.2012 часть 3
5) Кстати, что делается в случае если param == null_double для записи с новым ID? Если для записи в Т3 поступит структурас id, которого еще не было в таблице, и с param == null_double, то в Т3 будет добавлена запись. В INSERT я укажу поле ID, равное id, и не укажу поле PARAM. Неуказанное поле, насколько я понимаю, по умолчанию окажется == NULL. 6) Про способы использования: Это ясно (для Т1).1. Я имел в виду, что ты всё оставляешь как сейчас, но при генерации текста запроса вместо данных подставляешь заполнители (например символы "?"). После этого биндишь переменные (как в справке по QSqlQuery) В этом случае данные в сервер попадают минуя преображение в строку у тебя в коде и обратно на сервере. Меньше преобразований - меньше накапливается ошибок. Причём объект QSqlQuery после prepare можно не удалять, а сохранить где-то, и для следующего запроса только подставить (забиндить) новые параметры. 7) уточняющий вопрос про prepare и addBindValue Поля таблицы T2: ID INTEGER NOT NULL (PK, автоинкрементное поле), N записи, TO_OBJ_ID INTEGER NOT NULL (FK), N устройства, PARAM DOUBLE PRECISION NOT NULL, значение параметра. Таблица Т2 может содержать [0..200] значений PARAM для каждого TO_OBJ_ID. А для обработки поступившего массива со значениями PARAM для одного конкретного TO_OBJ_ID вариант а) лучше, чем б) и в)? (TO_OBJ_ID здесь одно и то же, PARAM - разные)
8 ) В случае Т3 можно сделать кеширование. Вы предлагаете использовать QMap<K, T>, структуру данных, которая содержит пары ключ-значение,Например QMap где ключом будет состав изменяемых полей а значением - препарированный запрос. упрядоченные по возрастанию ключей? Я понимаю так, что это будет QMap<QString, QVariant> map; где QString - наименование поля таблицы, QVariant - значения поля таблицы. Вставляем в map только поступившие в Rec значения полей и их наименования, для чего для каждого поля проверяем, равно ли его значение константе null_... для соотв. типа поля. Из полученного списка keys получаем часть строки запроса с названиями полей, дополняем строку соотв. кол-вом символов '?', потом в цикле делаем addBindValue, занося в запрос значения полей из полученного списка values. 9) То, что Вы написали нужно проверять в триггере, понятно. Только я пока не создавала таких триггеров в базе, а делала проверки в тексте Qt. 10) С хранимками еще совсем не разбиралась. ![]() 11) Ну и я бы стал делать вариант 2 (с триггерами) и 3 (с хранимками) только в том случае, Уф, успокоили, что это необязательно для моего случая.если данные в базу могут поступать из разных приложений. В противном случае это дополнительное усложнение схемы данных. Мне еще не доводилось писать базы, данные в которые прямо записываются из разных приложений. Сама из Qt-программы пишу данные в БД, выдаю результаты запросов к БД другим людям, модули которых вместе с моими находятся в одном приложении. Уважаю за терпение дочитавших до конца! Простите студента за многословие. ![]() Сообщение отредактировал Steklova Olga - 10.2.2012, 10:16 |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 18.2.2025, 9:25 |