Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-14041
vinivor
2002-08-26 18:25
2002.09.05
Регулировка звука из программы - как это сделать?


3-13868
dimanew
2002-08-14 07:46
2002.09.05
Capability not supported


3-13926
bobr12
2002-08-15 12:32
2002.09.05
Как поставить на машину BDE?


1-14023
AndreFJ
2002-08-26 14:39
2002.09.05
Как использовать анимированный курсор в программе?


1-14124
ErmSergey
2002-08-23 14:46
2002.09.05
Добавление событий





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский