|
|
|
вызов функции Oracle в C# - возвращает набор данных
|
|||
|---|---|---|---|
|
#18+
В общем, не претендую на "совет от мастера".. ибо родилось в бою.. :) Но, сам искал решение, и в общем то так и не нашел внятного ответа не тут не там.. Суть: Часто есть необходимость программировать на стороне сервера "умные" запросы возвращающие наборы данных, иными словами, параметроризованные view но с логикой условия несколько сложней чем простое WHERE.. На этот случай, в Oracle есть по сути два подхода - процедуры и функции. Преимущества того или иного не буду обсуждать, скажу только то, что в процедуру мы должны передать указатель (ссылку) на курсор а функция этого не требует ибо просто возвращает набор данных. В любом случае, мне показалось использование функции более удобным. Замечу, разговор идет не о вызове на стороне сервера а о работе из приложения, в данном случае, написанного на C#. Но по сути, организация такого подхода может с успехом пользоваться и на стороне сервера. Ничего нового нет, гуру могут пить кофе.. :) И так, первое что надо сделать, объявить тип ссылочного курсора, по сути, это будет аналогичным типу DataSet. Объявить можно пример так: Код: plaintext 1. 2. 3. 4. далее, что бы не париться со схемами (есть подозрение, что правильно строить БД и размещать объекты (таблицы и т.д.) таки не в схеме sys... :) ) при обращении к этому типу, просто создадим публичный синоним Код: plaintext А далее все намного проще чем казалось: Например, нам надо отобразить набор данных в зависимости от условия или из одного источника или из другого, причем эти источники (например, таблицы) совершенно разные и по составу и по содержанию. Делаем функцию: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Таблица DEP - подразделения - имеет например 15 полей Таблица PLANTS - производственные участки имеет например 25 полей Причем, в случае, если передан параметр WORKER отличный от 0 то возвращаем по сути VIEW основанный на 2-х таблицах. В общем то на стороне сервера всё.. Вот, мы создали приложение на C# и как же достучаться до этой функции??? попробуем так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. Честно говоря, если Вы будите использовать визуальный конструктор датасета, то это не пригодится, всё сделают за вас. Но, часто все же надо ручками - и этот пример, возможно не совсем полноценный, т.к. лень было делать отдельно приложение и вывод у меня идет не на консоль а в ListView - но в данном случае это думаю не критично, достаточно и наглядно.. :) Так что нет никаких сложностей, хотел добавить ответ на вопрос, как сделать так, что бы например в ComboBox`е одно а получались значения другие, т.е. как организовать например это Код: plaintext 1. *************************************** ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2010, 11:12 |
|
||
|
вызов функции Oracle в C# - возвращает набор данных
|
|||
|---|---|---|---|
|
#18+
Ошибочка (спешка, млин) Название функции надо заменить, превести к одному виду, или CREATE OR REPLACE FUNCTION L3.GET_CHEM_ANL( D1 DATE, D2 DATE, WORKER INTEGER) RETURN SQLGET.TCURSOR -> CREATE OR REPLACE FUNCTION L3.GET_WORK_PLANT ( D1 DATE, D2 DATE, WORKER INTEGER) RETURN SQLGET.TCURSOR Или cmd.CommandText = "L3.GET_WORK_PLANT"; -> cmd.CommandText = " L3.GET_CHEM_ANL "; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2010, 11:17 |
|
||
|
вызов функции Oracle в C# - возвращает набор данных
|
|||
|---|---|---|---|
|
#18+
Ошибочка (спешка, млин) Название функции надо заменить, превести к одному виду, или CREATE OR REPLACE FUNCTION L3.GET_CHEM_ANL( D1 DATE, D2 DATE, WORKER INTEGER) RETURN SQLGET.TCURSOR -> CREATE OR REPLACE FUNCTION L3.GET_WORK_PLANT ( D1 DATE, D2 DATE, WORKER INTEGER) RETURN SQLGET.TCURSOR Или cmd.CommandText = "L3.GET_WORK_PLANT"; -> cmd.CommandText = " L3.GET_CHEM_ANL "; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2010, 11:18 |
|
||
|
вызов функции Oracle в C# - возвращает набор данных
|
|||
|---|---|---|---|
|
#18+
кстати, есть подозрение, что с типом можно поступить проще.. Если у кого есть мнение - буду признателен за совет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2010, 12:28 |
|
||
|
вызов функции Oracle в C# - возвращает набор данных
|
|||
|---|---|---|---|
|
#18+
Курсор можно не объявлять, а юзать sys_refcursor. Для комбобокса создается класс или структура Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. при чтении заполняем коллекцию этих классов Collection<Person> и присваиваем в datasource сомбобокса выбранное юзером значение приводим к Person и наслождаемся всеми полями по отдельности, а отображается то что в ToString() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2010, 17:08 |
|
||
|
вызов функции Oracle в C# - возвращает набор данных
|
|||
|---|---|---|---|
|
#18+
bgnКурсор можно не объявлять, а юзать sys_refcursor. угу, попробую. Спасибо. bgn Для комбобокса создается класс или структура Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. при чтении заполняем коллекцию этих классов Collection<Person> и присваиваем в datasource сомбобокса выбранное юзером значение приводим к Person и наслождаемся всеми полями по отдельности, а отображается то что в ToString() Да, я это и имел ввиду, только из двух полей - целого и строкового, т.е. SelectеdValue - это числовой код что нужен. С коллекцией так же спасибо, есть где применить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2010, 22:28 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36670505&tid=1351273]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 508ms |

| 0 / 0 |
