Форум: "Базы";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
ВнизЯ ненавижу StoredProc! Найти похожие ветки
← →
Пушкин (2002-08-14 11:03) [0]Привет! Большой трабл с обновлением базы данных! Исходные данные: DataSource
и StoredProc. StoredProc возвращает рез-т работы хранимой процедуры в DBGrid.
Естественно, напрямую обновлять таблицу тоже низзя. Опять таки для изменения
бд есть хранимые процедуры. Так вот, вопрос в том, где и когда дергать commitupdates,
applyupdates и запускать хранимые процедуры обновления набора данных, чтобы
эта сволочь: 1) Не говорила что "Table is read only" (хотя и обновляет)
2) Не говорила что Stack overflow 3) Работала как швейцарские часы. PS:
Вызов applyupdates & commitupdates перепробован в различных комбинациях
и св-вах storedproc, но ни к чему не привел.
Кто сталкивался с подобным?
← →
Kaban (2002-08-14 11:10) [1]StoredProc возвращает рез-т работы хранимой процедуры в DBGrid.
Это как?
← →
Пушкин (2002-08-14 11:24) [2]Это очень просто. Ликбез:В StoredProc есть такое свойство - StoredProcName. Так вот там пишется имя нужной хранимой процедуры. StoredProc-компонент и хранимая процедура это разные вещи.
← →
Kaban (2002-08-14 11:26) [3]тогда надо писать
рез-т работы хранимой процедуры возвращается в DBGrid
а то у вас получается, что StoredProc и хранимая процедура - разные вещи, отсюда и недопонимание
← →
Kaban (2002-08-14 11:28) [4]Для этого надо, наверное, TUpdateSQL использовать
← →
Zelius (2002-08-14 11:31) [5]Есть такое чувство что Гегеля с Бабелем перепутали...
Если вопрос касается только базы данных, до надо подключаться к базе через TDatabase и вызывать ее методы StartTransaction, Commit, Rollback, а не xxxxxxxxUpdates.
Выглядит просто:
MyDatabase.StartTransaction;
try
MyStoredProc1.ExecProc; // процедура изменения данных, не выборки!!!
MyDatabase.Commit;
except
MyDatabase.Rollback;
raise;
end;
← →
Fiend (2002-08-14 11:32) [6]Это надо сделать вот так:
к комп. StoredProc подцепить UpdateSQL (в нём обозначить батчи для добавления, удаления, и модификации соотв)
у StoredProc включить CachedUpdates, и смело открывать StoredProc.
ApplyUpdates делать как советуте Борланд, через транзакции, в справке есть пример. Делать например после того как юзер нажал кнопку Ок, т.е. завершил работу именно с этими данными
← →
Пушкин (2002-08-14 11:51) [7]Не,updatesql отпадает, поскоку в проге не должно использоваться имен файлов бд. Только алиас. Это может дать только использование хранимых процедур и storedproc-компонента. Поэтому и query я не использую. Кстати query+updatesql работают на ура, а storedproc+updatesql ни хера. Извините, уже злюсь.
← →
Fiend (2002-08-14 12:36) [8]Смутно как то вы говорите про использование имён баз.
Но это тоже не вопрос.
батчи для UpdateSQL тоже можно динамически сформировать помере надобности
← →
Alexandr (2002-08-14 12:47) [9]слушай ты, Пушкин,
1) нахрена свой глупый вопрос, но зато в очень резкой и вызывающей форме, постить в различные форумы.
2) Какая у тебя СУБД, а то тут ты пишешь Informix, в другом форуме Interbase...
3) Из твоих фраз видно, что ты абсолютно не разбираешься в том про что пишешь.
Вообщем, подумай, надо ли тебе это все вообще, и может проще сначала книжки почитать?
← →
Пушкин (2002-08-14 12:57) [10]Вопрос - как? Допустим, StoredProc возвращает (и отображает в dbgrid"е) три поля: (expression), (expression)_1 и (expression)_2 (да-да, именно с таким именованием полей - со скобочками и тп и это помоему не лечится). Далее, предположи что я юзаю updatesql И мне надо удалить запись. Далее предполагаем что удаление (как вставка и модификация) выполняется также через хранимые процедуры. То бишь в св-ве DeleteSQL UpdateSQL"я я честно пишу execute procedure (:plums,:cars,:cats) а она естественно честно не удаляет, поскольку в наборе данных, возвращенном storedproc, таких полей нет. А эти дурацкие скобочки и подчеркивания updatesql не понимает. А вот если делать все тоже самое но на query тогда все работает на ура...
← →
Пушкин (2002-08-14 13:04) [11]2Александр: Уважаемый, я хочу решить свою проблему. Поскольку до маразма мне далековато, я НЕ МОГ написать в одной конфе IB а в другой Informix. Я не равлекаюсь, переключаясь между окнами эксплорера. Читайте внимательнее! А на последок - по-моему абсолютно не ваше дело, в одну конфу я зашел или в десять и в чем я разбираюсь, а в чем нет!
← →
Desdechado (2002-08-14 13:07) [12]у меня вообще-то Informix из ХП возвращает имена вида COLUMN1, COLUMN2 ..., правда, это через ODBC+BDE. и никаких скобочек.
но дело не в этом. что за "указание имен файлов БД" и причем тут алиас? тебе хоть названия таблиц известны?
← →
Fiend (2002-08-14 13:14) [13]Да, у StoredProc есть один обнаруженный мной недостаток - глюк.
Но здесь он не причём.
Ну и пусть у вас поля так называются как вы сказали со скобочками. Чтобы решить этот вопрос надо знать какая у вас СУБД. Это решаемо, поверьте. Скажите что у вас.
Ну а по поводу запуска ХП для удаления и пр.
Вы ведь должны понимать, что для запуска этих процедур, вы не сможете дать данных, больше, чем вернула "открываемая" вами ХП. Поэтому процедуры удаления и т.п. должны работать именно на основе этих данных.
Если у вас MS SQL, то приведите исходы всех ХП (просматриваемая и пр.)
← →
Пушкин (2002-08-14 13:17) [14]Видимо я сумбурно написал. Исправляюсь. Нужно сделать максимально надежного клиента (в плане безопасности бд). Если работать c Query, то там _необходимо_ указать имя таблицы, чего в моем случае к сожалению делать категорически нельзя. Поэтому было принято решение использовать StoredProc - она может возвращать данные посредством хранимой процедуры, прописываемой в одном ее св-ве. Так вот, именно дельфевая StoredProc и возвращает такие странные имена и переименование не помогает. А вследствие этого глючит updateSQL, я думаю. А у меня все работает через информикс-клиент и бде. Так быстрее почему-то.
← →
Fiend (2002-08-14 13:22) [15]Используйте Query для выполнения ХП, которую хотите посмотреть. Если она возвращает курсор, то напишите запрос который выполняет процедуру, а у Query вызовите метод Open, и у вас откроется курсор, который возвращает процедура. Затем цепляйте к Query - UpdateSQL
← →
Kaban (2002-08-14 13:23) [16]Странно вы рассуждаете
Вы не хотите работать с TQuery, так как не хотите привязываться к имени таблицы
Поэтому вы решили делать запрос через хранимую процедуру
Но хранимая процедура-то все равно делает запрос к какой-то таблице
← →
xGrey (2002-08-14 13:24) [17]To Пушкин:
Используйте TUpdateSQL только для вывода НД из состояния "только для чтения".
Модификацию данных производите с помощью соотв. хранимой (вызывая ее в Delphi через TStoredProc). В этой же хранимой управляйте транзакциями и обрабатывайте возможные исключительные ситуации.
← →
Пушкин (2002-08-14 13:30) [18]2Fiend: Конгениально! Попробую, спасибо!!
2Kaban: Ну да, хп делает запрос к таблице, но только она сама знает к какой! Хп ведь лежит на сервере и "пощупать" ее с клиента не удасться, не сломав сервак... Можно только узнать ее параметры, их типы и пр. Все-таки надежнее чем явное указание имен таблиц по-моему.
Спасибо!!
← →
Fiend (2002-08-14 13:35) [19]То Пушкин
Это не конгениально - это нормально.
Я в принципе, тоже недолюбливаю storedProc из-за одного глючка, по другому это не назвать. Ну буду вдаваться в подробности, шо за глючок, но в моих проектах ваще не использую StoredProc, всегда TQuery, в основном запросы формирую динамически, используя один компонент, для многих нужд.
С наилучшими!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c