Здравствуйте, гость ( Вход | Регистрация )
|
Steklova Olga |
3.2.2012, 21:20
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4
|
Всем привет!
Есть у меня две таблицы БД: 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, видимо используя какую-то точность сравнения. Или так и надо? Других вариантов не придумала. У кого какие мысли есть по этому поводу? Спасибо. |
|
|
|
![]() |
|
Tonal |
9.2.2012, 9:45
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17
|
Про Т2 и прзиционирование:
Что-то я не очень понял, если для Т2 используется та же структура, то почему не использовать ID для позиционирования. В противном случае не ясно что делать при наличии 2х и более одинаковых (или очень близких) значений PARAM в массиве. Как-то ты же должна задавать на этом массиве порядок/сортировку для выборки. Иначе можно получить данные совершенно не в том порядке и позиционирование будет бессмысленно, потому что в "уже просмотренные" попадут совсем ни те данные. Если порядок таки задан - то и запоминать позицию нужно ориентируясь на него. Пример: Цитата Поступает 1-й раз массив со значениями PARAM (1.23, 2.34, 300.45, 445.00), оператор начинает его просмотр, делает текущей запись со значением 300.45, Куда позиционироватся, если следующий запрос вернёт: PARAM (445.00, 2.34, 300.45, 1.23) или PARAM (1.23, 2.34, 300.45, 300.45, 300.45, 300.45, 445.00) или PARAM (3.38, 1.32, 300.45001, 455.01, 300.44999) И что это будет значить для оператора? Про способы использования: 1. Я имел в виду, что ты всё оставляешь как сейчас, но при генерации текста запроса вместо данных подставляешь заполнители (например символы "?"). После этого биндишь переменные (как в справке по QSqlQuery) В этом случае данные в сервер попадают минуя преображение в строку у тебя в коде и обратно на сервере. Меньше преобразований - меньше накапливается ошибок. Причём объект QSqlQuery после prepare можно не удалять, а сохранить где-то, и для следующего запроса только подставить (забиндить) новые параметры. В случае Т3 можно сделать кеширование. Например QMap где ключом будет состав изменяемых полей а значением - препарированный запрос. 2. В триггере перед изменением можно проверить - если поле опциональное, восстановить предыдущее значение, например: 3. Всё то же самое - определение состава обновляемых полей и выбор варианта запроса. Или его можно собрать в процедуре и выполнить через execute statiment. Практически тот же вариант 1, но перенесённый на сервер. Кстати, что делается в случае если param == null_double для записи с новым ID? Ну и я бы стал делать вариант 2 и 3 только в том случае, если данные в базу могут поступать из разных приложений. В противном случае это дополнительное усложнение схемы данных. |
|
|
|
Steklova Olga просмотр таблицы с меняющимися данными, запоминание и выделение тек строки 3.2.2012, 21:20
ilyabvt Цитата3) Запоминать PARAM текущей строки, а при по... 3.2.2012, 23:51
Steklova Olga ЦитатаСравнивайте также как вы бы сравнивали целоч... 4.2.2012, 21:22
ilyabvt Цитата(Steklova Olga @ 5.2.2012, 0:22) Ци... 4.2.2012, 22:46
Steklova Olga ЦитатаЯ не имел ввиду что нужно конвертировать в ц... 5.2.2012, 17:34
Steklova Olga Однако не все так тривиально...
1) Зачем-то же на... 6.2.2012, 20:04
Tonal Цитата(Steklova Olga @ 7.2.2012, 0:04) Де... 7.2.2012, 8:11
Steklova Olga 1) ЦитатаИспользуйте биндинг переменныхПонятно, ка... 7.2.2012, 14:40
Tonal 1)
Ты же вроде бы писала, что T2 ты очищаешь и вст... 8.2.2012, 8:51
Steklova Olga Таблицы Т1 и Т2 - это один пример,
таблица БД с п... 8.2.2012, 12:14
Steklova Olga Привет! Пишу на этот раз сразу несколько сооб... 9.2.2012, 21:04
Steklova Olga 09.02.2012 часть 3
5) Цитата(Tonal @ 9.2.2012... 10.2.2012, 10:14
Tonal Т. е. с позиционированием ты разобралась.
Могу то... 10.2.2012, 12:00
Steklova Olga Привет!
6. Цитатасохраняется ли препарированн... 10.2.2012, 17:01![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 8.1.2026, 2:19 |