| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Обновление, изменение данных через IBDataSet |
| Автор: holodnaya 9.11.2009, 20:09 | ||
| Кто хорошо знаком с компонентами, позволяющими работать Delphi с FireBird, подскажите, пожалуйста, как лучше сделать. В одной форме у меня таблица с выведеными данными по студентам (Использую cxGrid, соединенный с IBDataSet1). А редактирование и добавление новых данных происходит в другой форме (в основном, используются DBEdit-ы). Для того, чтобы во второй форме отображались данные по выбранному студенту, DBEdit- ы соединяю с тем же IBDataSet1. в IBDataSet1 запрос только на выборку данных (SelectSQL). При этом я понимаю, что с таким запросом через IBDataSet1 с данными кроме выбора ничего больше сделать нельзя. Задаю запросы Insert/Update/Delete/Refresh, и программа ругается...
При этом меня смущает, что все эти запросы хранятся одновременно в соответсвующих свойствах SelectSQL, InsertSQL и т.д. Вопрос №1. Как же всё-таки правильно сделать? Сразу их задавать или по мере необходимости (при вызове определённой процедуры и соответсвенно в коде писать)? И ещё вычитала одно замечание, что при использовании IBDataSet для выборки данных, их изменение и добавление лучше проводить через IBQuery... но тогда придётся ручками код прописывать для вывода данных на вторую форму. Вопрос №2Каким способом (с помощью какого компонента) лучше и правильнее изменять данные (при этом нужно учесть, что данные редактируются не в самой таблице, а в другой форме). |
| Автор: holodnaya 9.11.2009, 23:29 |
| Ура! Мне удалось решить один вопрос Все запросы SelectSQL, InsertSQL... действительно нужно устанавливать в IBDataSet одновременно (наверное, в нужное время они вызываются как у IBTable, только у IBTable запросы формируются автоматически, а здесь можно самим формировать). Причем, очень важно, чтобы последовательность полей в Insert была такой же как в базе (генератором запроса может и в другом порядке сформироваться). А ошибка выходила потому, что имя поля "WORK" по каким-то причинам не понравилось компоненту, обращающемуся из делфи к базе (наверное, зарезервированное слово... А вот на вопрос, каким компонентом правильнее изменять данные IBDataSet или IBQuery, я всё же надеюсь получить ответ ) |
| Автор: Данкинг 9.11.2009, 23:44 |
Я бы предпочёл Query - для того он и придуман, в конце концов. |
| Автор: holodnaya 10.11.2009, 23:05 | ||||
IBDataSet проще использовать, но тогда не очень красиво получается, в одной форме добавляешь данные или редактируешь, в общей таблице видны сразу все изменения. Как сделать так, чтобы изменения в таблице были видны только после закрытия Формы редактирования? Если использую IBQuery и пишу такой код (при нажатии на кнопочку "Изменить данные")
получаю ошибку
Или как устранить эту ошибку и в чем причина её возникновения? |
| Автор: Данкинг 10.11.2009, 23:33 | ||||
Кому как.
Значение параметра присваивай после DM.IBQuery1.SQL.Add(Query). |
| Автор: holodnaya 10.11.2009, 23:49 |
Я только что опробовала эту последовательность, но ошибка не исчезла... |
| Автор: Данкинг 11.11.2009, 00:10 | ||
Эмм... holodnaya, текст ошибки читала?
|
| Автор: holodnaya 11.11.2009, 00:17 |
Читала, но из этого я не могу понять причину её возникновения. |
| Автор: Данкинг 11.11.2009, 00:18 | ||
Как переводится сообщение об ошибке? |
| Автор: holodnaya 11.11.2009, 00:24 |
С английским у меня, конечно, не очень... Но я так понимаю, что столбец ID_STUDENT неизвестен (то есть не найден)... Я понимаю, если бы в заспросе было несколько таблиц и в каждой из них было одинаковое поле, но здесь-то одна таблица и поле там такое точно есть |
| Автор: Данкинг 11.11.2009, 00:28 |
Тогда попробуй: 1) Вызывать DM.IBQuery1.Close перед DM.IBQuery1.SQL.Clear 2) Переименовать параметр ID_STUDENT, чтобы он не совпадал с названием поля. Добавлено через 56 секунд Да, и вообще, с запросами SELECT... используется DM.IBQuery1.Open, а не DM.IBQuery1.ExecSQL. |
| Автор: holodnaya 11.11.2009, 00:38 | ||
Выдает ошибку, что парамерт param не найден. А его не надо изначально ещё как-то объявлять, прежде чем устанавливать туда значение? |
| Автор: Данкинг 11.11.2009, 00:43 | ||
Бывает такая тупость, как "параметр не найден"... В таких случаях я делаю просто:
|
| Автор: holodnaya 11.11.2009, 00:51 |
| Я тоже так делаю иногда ))) Нашла как здесь справиться, нужно просто у свойства ParamCheck = true, так как используются параметры в запросе Спасибо за советы, Данкинг! |
| Автор: Данкинг 11.11.2009, 01:48 | ||
Не знал, учту на будущее. Взаимно спасибо за ParamCheck. |
| Автор: holodnaya 17.11.2009, 23:57 |
| Не закрывала тему до тех пор, пока не реализовала все операции: удаление, изменение, добавление данных в базу. Очень удобно производить все изменения используя IBQuery, хотя IBDataSet мне изначально показался проще |