Привязка к рекордсету или собственноручное написание запросо

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Привязка к рекордсету или собственноручное написание запросо

Сообщение Wasup! » 02.02.2007 (Пт) 12:01

Скажите, пожалуйста, какой подход при редактировании данных в БД вы предпочитаете, и почему? Связанный с рекордсетом грид, который используя возможности рекордсета автоматически генерирует необходимые запросы в БД или собственноручное написание и отправка всех sql-запросов (кстати, а как в таком случае обновлять грид?)

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 02.02.2007 (Пт) 20:39

Тот, который решает поставленную задачу.

Если требуется визуализация содержимого базы - нужен к-л контрол. Скажем, табличный.

Но можно использовать невидимые Data или ADODc, чтобы перемещаться по записям и использовать их события.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.02.2007 (Сб) 8:47

В 99% случаев отсоединенные рекордсеты и биндинг. Потому что уже сто лет назад написан весь функционал для редактирования, который кочует из проекта в проект, а так же не нужно избретать всякую хрень для записи данных в базу.

А вот DATA и особенно ADODC использовать не рекомендую.
Лучший способ понять что-то самому — объяснить это другому.

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 05.02.2007 (Пн) 12:55

В 99% случаев отсоединенные рекордсеты и биндинг.
Отсоединенный рекордсет, это:
Код: Выделить всё
rs.open
set rs.activeconnection=nothing
cnn.close
… 'редактирование данных пользователем
cnn.open
rs.updatebatch

Правильно? А какие этот подход дает преимущества?

Тот, который решает поставленную задачу.
Поставленная задача: выдача результатов sql запроса в грид, возможность эти данные редактировать (ins,upd,del) и отправлять обратно в базу. При этом уменьшить нагрузку на сеть (если некоторые значения подставляются триггерами, то не тащить на клиента заново всю выборку, а только те записи которые были отредактированы), обеспечить проверку форматов вводимых данных (например, дата только yyyy.mm.dd), для некоторых таблиц возможность редактирования через хранимые процедуры.

Уверен, что все кто работает с базами данных, эту задачу для себя решили. Поделитесь опытом. Понимание отдельных методов у меня есть, а в комплексе никак не увязывается.

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 06.02.2007 (Вт) 10:47

Понимаю, знающим людям все очевидно. А вот мне совсем нет, напишите Ваши варианты и одним непонимающим станет меньше. :roll:

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 09.02.2007 (Пт) 0:03

Поставленная задача: выдача результатов sql запроса в грид, возможность эти данные редактировать (ins,upd,del) и отправлять обратно в базу. При этом уменьшить нагрузку на сеть (если некоторые значения подставляются триггерами, то не тащить на клиента заново всю выборку, а только те записи которые были отредактированы), обеспечить проверку форматов вводимых данных (например, дата только yyyy.mm.dd), для некоторых таблиц возможность редактирования через хранимые процедуры.

К примеру, можно в соответствие с заданными критериями выводить в грид список записей только для просмотра. Если записей слишком много, заставить юзера уточнить критерии -- это основной способ уменьшения нагрузки на сеть и сервер.
Редактирование выбранной записи сделать не в гриде, а через вызываемую формочку. В этой форме на этапе ввода производить валидацию данных в соответствие с требуемыми условиями. Значения, которые подставляются тригерами не выводить в грид, а только на форму редактирования (тогда не придется обновлять каждый раз грид). Сохранять через хранимую процедуру значения с формы я думаю проблем не составит.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 12.02.2007 (Пн) 16:41

Правильно ли я понимаю, что в таком случае я работаю с отсоединенным от базы рекордсетом (rs.activeconnection=nothing)?
То есть, когда пользователь нажимает кнопку "Сохранить" на форме для редактирования.
Я отправляю в базу оператор cnn.execute "update mytable set … = …" и одновременно обновляю данные в отсоединенном рекордсете
rs.field(0)=NewValue1
rs.field(1)=NewValue2
Дальше обновляю строчку в гриде.

А при добавлении записи отправляю в базу cnn.execute "insert into mytable …", добавляю строчку к рекордсету и заполняю её вручную. rs.addnew, rs.field(0)=NewValue1…
Добавляю строчку в гриде.

Точно так же работаю и с подставляемыми триггерами значениями.
rs.open "select id, value, timestamp from mytable"
Редактирование пользователем
cnn.execute "update mytable set value=NewValue where id=1" 'обновление таблицы в базе
rs2.open "select id, value, timestamp from mytable where id=1" 'значение timestamp подставляется в триггере, поэтому выбираем его из базы
Обновляем эту строчку в основном рекордсете rs(2)=rs2(2).
Обновляю грид.

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


У меня такое чувство, что я как раз и занимаюсь изобретением хрени…
:oops:

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 13.02.2007 (Вт) 1:45

Wasup! писал(а):Правильно ли я понимаю, что в таком случае я работаю с отсоединенным от базы рекордсетом (rs.activeconnection=nothing)?
Я работатаю с обычным. Но в принципе без разницы с каким рекордсетом работать, отсоединенным или нет.

Wasup! писал(а):То есть, когда пользователь нажимает кнопку "Сохранить" на форме для редактирования.
Я отправляю в базу оператор cnn.execute "update mytable set … = …" и....
Лиично я так бы не делал. Зачем вручную делать Insert/Update базы, если ты пользуешься рекордсетом?

Как один из вариантов (упрощенно):
Открываем коннекшн и рекордсет.
Код: Выделить всё
rs.Open "SELECT...", cn, adOpenKeyset, adLockOptimistic

Открываем запись на редактирование в новом окошке, заполняем элементы (напр. Textbox'ы) значениями из рекордсета:
Код: Выделить всё
Text1.Text = rs.Fields(0).Value
Text2.Text = rs.Fields(1).Value
.........

После внесения изменений сохраняем данные (перед этим можно проверить, не противоречат ли данные наложенным ограничениям):
Код: Выделить всё
rs.Fields(0).Value = Text1.Text
rs.Fields(1).Value = Text2.Text
rs.Update
Unload Me

Вот и весь процесс редактирования. При этом не нужно вручную обновлять грид, т.к. все изменения текущего рекордсета там автоматически отразятся.

Wasup! писал(а):значение timestamp подставляется в триггере, поэтому выбираем его из базы
А значение поля timestamp пользователю должно быть вообще безразлично и выводить его вообще не нужно. Поле типа Timestamp не используется для хранения даты/время -- для этого существует datetime.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 13.02.2007 (Вт) 13:34

VVitafresh писал(а):Вот и весь процесс редактирования. При этом не нужно вручную обновлять грид, т.к. все изменения текущего рекордсета там автоматически отразятся.


Да и для редактирования далеко не всегда нужно форма - зачастую это удобно делать в самом Grid-e - валидируется он ничуть не хуже.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Wasup!
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 120
Зарегистрирован: 21.06.2005 (Вт) 11:09

Сообщение Wasup! » 14.02.2007 (Ср) 12:30

С простым редактированием таблицы вроде бы все понятно. Привязываем рекордсет к нормальному гриду (TDBGrid и т.д.) и возлагаем всю работу на него. Получается даже не надо вызывать методы рекордсета, все сделает грид.
А если редактирование таблицы идет через хранимки?
Я никак не вижу простого способа это сделать, не прибегая к отсоединению рекордсета и ручного его обновления.
На примере добавления записи через ХП.
Код: Выделить всё
rs.open "select Id1, Value, Id2 from MyTab"
set rs.activeconnection=nothing 'чтобы при работе с рекордсетом изменения не отправлялись в базу
cnn.execute "Call AddNewRecToMyTab(?,?)", NewId1,NewValue 'добавили запись в базу, Id2 подставляется в процедуре
rs2.open "select Id1, Value, Id2 from MyTab where Id1=NewId1" 'получили все поля только что добавленной записи
rs.addnew 'добавили пустую строку к рекордсету
rs(0)=rs2(0) 'заполнили её полученными значениями
rs(1)=rs2(1)
rs(2)=rs2(2)
'Обновили грид


Это можно упростить?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.02.2007 (Ср) 17:37

Wasup! писал(а):Это можно упростить?


Можно еще уйти в NET - там изначально все под это завязано...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 15.02.2007 (Чт) 0:20

Wasup! писал(а):А если редактирование таблицы идет через хранимки?
Я никак не вижу простого способа это сделать, не прибегая к отсоединению рекордсета и ручного его обновления.

Это можно упростить?

Если редактировать через ХП и избегать rs.Requery то вряд ли упростить...

Другой вопрос, нужно ли выводить в грид все значения, которые могут быть изменены через ХП? Возможно, достаточно выводить минимальный неизменяемый набор данных (типа: код, наименование), а деталировку записи подтягивать из БД при открытии формы редактирования. В этом случае вопрос обновления грида отпадет.

700 сообщение
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 106

    TopList