|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Функция: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
хранимка, где она юзается: Код: sql 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.
Запускаю в менеджере SQL Код: sql 1. 2. 3. 4.
выдает 1,2,3... и т. д. - работает стало быть Запускаю через ADO (VBA): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
выдает "переменная объекта или переменная не задана" другие процедуры, запускаемые аналогично отрабатываются, эта не хочет. В чем прикол? Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 15:48 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarm, дык в форуме VB и надо спрашивать пока вероятность того что какой-нибудь con не инициализирован примерно равна вероятности того что что-то не так с OUTPUT у адо ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 16:31 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
а так? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
и еще SET NOCOUNT ON первой строкой в хранимку. А вообще, в ADO есть ADODB.Command для выполнения процедур ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 16:47 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Родил таки: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Но блин, только с этой хранимкой такая трабла, остальные отрабатываются как выше написал. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 20:41 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Потому что другие хранимки не генерят дополнительные сообщения (которые подавляет set nocount on) ЗЫ: Если лень писать кучу CreateParameter, есть Parametes.Refresh, который получает готовую коллекцию параметров с сервера (лишний, но часто не очень принципиальный запрос к серверу) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 21:03 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Получаем Null. Хотелось бы функцию на VB сделать, типа: funSQLstr("параметры через разделитель") почему и потребность запустить хранимку с минимумом букв. Но если через CreateParameter делать, придется кроме вышеназванных еще и adVarWChar (или другой какой тип) и длину указывать. Потому как при adBSTR выдает опять же Null, а adVarWChar требует обязательной длины строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 21:27 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Shocker.ProПотому что другие хранимки не генерят дополнительные сообщения (которые подавляет set nocount on)А почему тогда к примеру эта работает по старому вызову? Код: sql 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. 55.
"дополнительные сообщения" - что имеете в виду? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 21:30 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
PalarmА почему тогда к примеру эта работает по старому вызову?потому что в ней есть set nocount on Palarm"дополнительные сообщения" - что имеете в виду?типа тех, которые выдает студия после выполнения запроса: "(1 row(s) affected)", а также варнинги, принты и т.п. Чтобы их все перебрать на клиенте используется NextRecordset в нужном количестве. А поскольку морочиться нужным количеством дело неблагодарное, обычно их подавляют set nocount on ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 22:06 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarm Код: vbnet 1.
msdnParameters Optional. A Variant array of parameter values used in conjunction with the input string or stream specified in CommandText or CommandStream. (Output parameters will not return correct values when passed in this argument.) я никогда так не вызывал, просто писал: Код: vbnet 1. 2.
не знаю, как себя поведет указание Parameters в Execute, но по хелпу мне кажется, что это не то разумеется, была функция-обертка для вызова процедур ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2015, 22:13 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
потому что в ней есть set nocount on его не было только в функции - добавил туда, так же требует чего то задать. Ставить подавление первой строкой тоже не помогло. Чую, тут какая то фигня простая, а мессага может вообще не о том верещит. Ну да пес с ней, сделал обертку конкретно под эту хранимку. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2015, 09:33 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Есть подозрение, что хранимка не пашет через execute потому, что там есть вызов функции, чего нет в других хранимках, которые запускаются нормально. По крайней мере вызов самой функции дает такую же месагу, если делать так: Код: vbnet 1.
А в менеджере отрабатывает нормально. И запуск хранимки в другой хранимке так же отрабатывает нормально: Код: vbnet 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.
Стало быть все зло от функций - осталось лишь найти какое. Было бы проще (меньше буковок писать) во многих случаях вместо хранимок с выходными параметрами вызывать функции через Execute - но они вообще так не взлетают. Видимо надо делать их запуск так же через cmd.Parameters с оберткой на VB? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2015, 09:47 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarmвызов самой функции дает такую же месагу, если делать так: Код: vbnet 1.
потому что тут-то возвращается рекордсет и надо обращаться с ним как с рекордсетом: Код: vbnet 1.
PalarmА в менеджере отрабатывает нормальностудия просто скрывает от тебя реальный возврат и оформляет результат по-человечески. А когда сам запускаешь, тебе точно нужно понимать, что у тебя процедура возвращает и реагировать соответствующим образом. А с функциями нет никаких проблем. Еще момент - пользователь, под которым ты выполняешь это в студии и в АДО. Дело в том, что при обычной процедуре достаточно прав только на процедуру, в случае же динамических запросов нужны права на все объекты, которые выполняются в динамике и все таблицы которые запрашиваются в динамике. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2015, 11:23 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Shocker.Proпотому что тут-то возвращается рекордсет и надо обращаться с ним как с рекордсетом Точно! :) Shocker.ProЕще момент - пользователь, под которым ты выполняешь это в студии и в АДО. Дело в том, что при обычной процедуре достаточно прав только на процедуру, в случае же динамических запросов нужны права на все объекты, которые выполняются в динамике и все таблицы которые запрашиваются в динамике.Это да, но у меня пока смешанная авторизация: коннект к серваку через sa либо юзера с правами на все объекты кроме их модификации - а дальше на клиенте раздача на объекты приложения. Когда доберусь до админских дел - это будет отдельная грабля. Спасибо за помощь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2015, 11:37 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Лапочка однако оказалась не та, пришлось ее разбить. Собрать данные в строку из запроса типа Код: sql 1.
не вопрос, а вот начиная с Код: sql 1.
пошли пляски с бубном Код: sql 1.
тут вообще карнавал. Потому как пишут в тырнетах и сам убедился динамический запрос типа Код: sql 1.
ацкое зло. Прикольно, что funSQLStr() у меня вообще то есть на VBA и работает прекрасно со всякими запросами, потому что траблы кавычками там не выходит. Дай думаю ее на T-SQL сделаю, говорят перенос логики на сервер признак ума. Ага Как говорится: не мешай механизму работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2015, 18:33 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
я вообще не очень понял, зачем ты там динамику пилишь. Динамика на сервере обычно требуется редко. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2015, 23:58 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Shocker.Proя вообще не очень понял, зачем ты там динамику пилишь. Динамика на сервере обычно требуется редко.В hp_SQLstr текст запроса является параметром, стало быть только динамикой и можно, в hp_InsertWrDoc пара предложений FROM одинаковые в двух местах, чтобы не писать 2 раза одно и тоже сделал динамический запрос. Привычка оптимизировать код, избегая копипаста. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 03:32 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
PalarmВ hp_SQLstr текст запроса является параметромэто я вижу, но, повторяю, я не понимаю зачем. По хорошему, клиент не должен думать о деталях хранения информации, и уж тем более не иметь никакого понятия о языке SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 08:32 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarmпара предложений FROM одинаковые в двух местахобычно такое оформляется в виде INLINE UDF или VIEW ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 08:33 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
мне нужен только текст FROM - как создать VIEW без SELECT - не представляю. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 17:10 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarmмне нужен только текст FROMскорее всего у тебя кривой подход, обычно не должно возникать в принципе такой необходимости. Если есть повторяемость, создаются подзапросы, которые можно вынести в VIEW или INLINE UDF. Нет, не спорю, существуют ситуации, когда запрос приходится именно конструировать, но это исключение, а не правило. Возможно, у тебя есть в этом необходимость, но "FROM одинаковые в двух местах" - это не основание, для этого делают представления. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 17:33 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarmмне нужен только текст FROM - как создать VIEW без SELECT - не представляю.по другому - ты мыслишь не теми категориями, видимо очень много лепил динамических запросов на клиенте в свое время. На TSQL так не пишут. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 17:34 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Имеешь в виду, что надо сделать что то вроде: ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 19:12 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5.
а потом уже это подставлять в итоговый запрос как вложенное представление? Хотя странный подход - динамический вроде проще и нагляднее ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 19:20 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarmпроще и нагляднеепочитай себя сам, что я могу добавить? Palarmтут вообще карнавалPalarmпошли пляски с бубномPalarmсам убедился динамический запрос .... ацкое зло.если запрос, разбавленный множеством кавычек, конкатенаций, convert-ов, задвоенных кавычек, без подсветки синтаксиса и т.п. проще и нагляднее - пиши динамику. Еще. Динамика компилируется каждый раз при вызове, каждый раз производится анализ таблиц и составляется план запроса. Не динамический запрос компилируется сразу, план составляется тоже сразу. Излишне говорить, что это влияет на производительность. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 20:15 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Так? Код: sql 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. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 20:35 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
А на клиенте соответсвенно: Код: vbnet 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 20:39 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Так это ж опять динамика. Что тебе мешает создать статическую вьюшку, я никак не могу понять. Зачем ее каждый раз создавать и удалять? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 20:43 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarm Код: sql 1. 2.
небольшое замечание по ходу дела: ты постоянно оперируешь между varchar и nvarchar-строками, то есть заставляешь сервер постоянно преобразовывать один тип данных в другой, правильно так: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2015, 20:50 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Shocker.ProТак это ж опять динамика. Что тебе мешает создать статическую вьюшку, я никак не могу понять. Зачем ее каждый раз создавать и удалять?Видимо долгое юзание Аксес в качестве СУБД сформировало порочные с позиции T-SQL автоматизмы мышления: динамические запросы, обработка данных на клиенте, процедурное программирование и т. д. - БД по сути использовалось как мешок для мусора, в котором надо ковыряться из клиента. В итоге со скрипом въезжаю в то, что для тебя банальности. PS: тут да, конечно пишем статичную вьюху - кавычки в топку ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2015, 03:48 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7.
При таком коде не будет лишних тормозов при пробежке по If-ам, которых может быть сотни? Тут как бы просится ELSEIF которого нет в T-SQL или может здесь при нахождении нужного условия дальнейший поиск прекращается? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2015, 19:54 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Shocker.ProДинамика компилируется каждый раз при вызове, каждый раз производится анализ таблиц и составляется план запроса. Не динамический запрос компилируется сразу, план составляется тоже сразу. Излишне говорить, что это влияет на производительность.Я так понимаю, что запуск селекта через ADO имеет тот же негатив? То есть con.Execute(...) выполняется медленнее чем запуск хранимки через тот же con.Execute? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2015, 19:57 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
PalarmПри таком коде не будет лишних тормозов при пробежке по If-ам, которых может быть сотни? Тут как бы просится ELSEIF которого нет в T-SQL или может здесь при нахождении нужного условия дальнейший поиск прекращается?Что мешает использовать else? elseif всего лишь удобная форма для записи цепочки if-ов. А вообще, правильнее под каждый селект создавать отдельную хранимку, а не пытаться запихать всю логику всего приложения в одну. Это, кстати, поможет оптимизатору SQL. Понимаю, что снова мешает менталитет программиста динамических запросов на клиенте, но, как я уже говорил, надо менять взгляды. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 14:01 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
PalarmЯ так понимаю, что запуск селекта через ADO имеет тот же негатив? То есть con.Execute(...) выполняется медленнее чем запуск хранимки через тот же con.Execute?совершенно верно. Select - это тот же динамический запрос. Как я уже говорил выше - клиента нужно писать так, чтобы он понятия не имел про язык SQL. Он просто вызывает хранимку с определенными параметрами и получает ответ в определенном формате. Нет ничего страшного, что на сервере будет тысяча хранимок. Тебе же не мешает та же самая тысяча процедур/функций на клиенте. Так и воспринимай - хранимка, это процедура/функция, которая выполняется на сервере, а не на клиенте. И если функция на клиенте или хранимка на сервере содержит всего одну строку - в этом нет ничего страшного. Данный подход имеет и побочный эффект: можно модернизировать хранилище, не переписывая клиента и/или сохранять совместимость со старыми версиями. Это особенно удобно, если клиентов много и взять и резко обновить всем версию клиента представляется затруднительным. Просто в новой версии обращаешься к тем же данным по-новому (новая хранимка или новые параметры хранимки, имеющие значения по умолчанию), старые клиенты продолжают работать по-старому ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 14:08 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Shocker.ProА вообще, правильнее под каждый селект создавать отдельную хранимку, а не пытаться запихать всю логику всего приложения в одну. Это, кстати, поможет оптимизатору SQL. Понимаю, что снова мешает менталитет программиста динамических запросов на клиенте, но, как я уже говорил, надо менять взгляды. Хочешь сказать, что вот так хранимку для списка писать не кошерно, с позиwии T-SQL Код: sql 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.
Я тут начал изворачиваться через комбинации параметров, чтобы через одну вьюху и хранимку создать источники для нескольких списков, использующих одну таблицу, но с разными фильтрами. А по твоим рассуждениям надо каждому списку свою хранимку - чтобы получить максимальную скорость. Ну допустим. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 20:19 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Натыкался еще на такой способ "уменьшения кол-во объектов на сервере" - использование .NextRecordset. То есть пишется хранимка с несколькими селектами, а спискам в той же последовательности присваиваются через .NextRecordset источники. Понятно, что опять рефлексия минимизации - а скорость будет такая же как при отдельных хранимках или ниже? Shocker.ProДанный подход имеет и побочный эффект: можно модернизировать хранилище, не переписывая клиента и/или сохранять совместимость со старыми версиями. Это особенно удобно, если клиентов много и взять и резко обновить всем версию клиента представляется затруднительным. Просто в новой версии обращаешься к тем же данным по-новому (новая хранимка или новые параметры хранимки, имеющие значения по умолчанию), старые клиенты продолжают работать по-старомуМне твой совет по переносу всех селектов на сервер толкнул еще одну мысль - проще будет сменить платформу клиента. Не век же на Аксесе лабать. + возможность развернуть целую сетку клиентских приложений на смартфонах, планшетах и т. п. юзающих одну БД + возможность параллельной разработки БД и клиента, как в web: дизайнер + программист. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 20:27 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarm Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
просто, если немножко подумать, то: Код: sql 1. 2. 3. 4. 5.
что касается [NOT] IN - то тут делается инлайн-функция для повторяющегося кода, а where и order остаютс в процедуре, но тот всего два варианта ведь, а не сотня ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 20:40 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
PalarmНатыкался еще на такой способ "уменьшения кол-во объектов на сервере" - использование .NextRecordset. То есть пишется хранимка с несколькими селектами, а спискам в той же последовательности присваиваются через .NextRecordset источники. Понятно, что опять рефлексия минимизации - а скорость будет такая же как при отдельных хранимках или ниже?тут, в общем-то, идет минимизация обращений к серверу. То есть используя возврат нескольких рекордсетов ты экономишь на накладных расходах установки соединения и отсылке запроса к серверу. При медленном соединении и интенсивных запросах на этом можно сэкономить. Но у меня, к примеру, в проекте с полутора тысячью хранимок этот прием используется дай бог в десятке. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 20:44 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Palarmпроще будет сменить платформу клиента. Не век же на Аксесе лабать. + возможность развернуть целую сетку клиентских приложений на смартфонах, планшетах и т. п. юзающих одну БД + возможность параллельной разработки БД и клиента, как в web: дизайнер + программист.Тогда во-первых смотри на трехзвенную архитектуру: СУБД, сервер приложения и клиент. При этом клиент в таком случае не то что об SQL, вообще о БД не имеет никакого понятия. Он обращается к серверу приложений за высокоуровневыми функциями. Но тут уже смотри... Последнее время есть тенденция использовать ORM. Это означает в основном отказ от языка SQL. Тут свои достоинства и недостатки, споров много, в основном переход на ORM считается прогрессивным. Я одно приложение наваял не очень нагруженное - да - удобно, но надо опять сильно перестраивать мозг. Вообще, выбор платформы, это тема бесконечной дискуссии )) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 21:00 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Спасибо за помощь :) Еще вопрос: есть много таких блоков Код: vbnet 1. 2. 3. 4. 5. 6. 7.
тут видится 2 варианта: 1. сделать udf возвращающей bit и в зависимости от него запускать мессагу (но опять же - как гвоздем по стеклу - лепить кучи одностроковых функций - эх) 2. вставить проверку в хранимку - делать прерывание - отсылать клиенту код - ждать ответа - продолжать или закрывать выполнение. Но тут походу кощунство для T-SQL адептов - попытка внедрить процедурное мышление :) Да и навряд ли T-SQL поддерживает такие пинг-понги с клиентом, по крайней мере я не встречал примеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2015, 08:40 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Во-первых, открой для себя Exists, это будет быстрее, чем Count>0 Во-вторых, проблему диалога с пользователем я лично для себя решил следующим образом. Дано - хранимка может выполнить задачу, либо вернуть ошибку, либо вернуть запрос на подтверждение пользователем продолжения работы хранимки (таких запросов может быть N). Хранимка возвращает >=0 при успешном выполнении, -1, если ошибка без возможности продолжения, -2 запрос к пользователю на возможность продолжения. Поскольку подтверждений может быть несколько, ответ циклически накапливается в Confirm, текст ошибки или подтверждения в ErrMsg. В хранимке: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
то есть в @Confirms$ накапливаются подтверждения пользователя типа N'MYKEY1$N'DELETE$EMPTYNAME$' и т.п. по количеству проверок. на клиенте Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
или Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2015, 11:49 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Стало быть повторный вызов с обновленным параметром, причем если через return то придется запускать через cmd.Parameters.Append cmd.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue). А если как мне больше нравится через con - тогда свой Output параметр туда вводить. Спасибо за наводку. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2015, 13:39 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
PalarmСтало быть повторный вызовда. Ведь надо понимать, что пользователь может думать час над мессаджбоксом, за это время в базе может много чего измениться. То есть все проверки каждый раз проводятся заново - во избежание... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2015, 13:50 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Наваял, работает, причем всем назло через con.Execute, а не cmd.Parameters :) Было: Код: vbnet 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.
Стало Код: vbnet 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.
И на серваке Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2015, 15:22 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Код: vbnet 1.
Предполагаю, что аналога именно такого прерывания нет в T-SQL, а нужно делать как в вышеприведеных примерах - отсылать клиенту код ошибки и там уже принимать решение - перезапускать выполнение хранимки или нет. Правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2015, 11:14 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
PalarmПредполагаю, что аналога именно такого прерывания нет в T-SQLчем не нравится return? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2015, 11:23 |
|
Результат хранимки через ADO
|
|||
---|---|---|---|
#18+
Вообще то да. Тогда еще вопрос: есть ли возможность организовать индикацию процесса выполнения хранимки? Имеется в виду отдельная форма с бегунком. Тут ведь по любому придется делать множество перезапусков хранимки, чтобы вернуть текущее состояние процесса и отразить его для пользователя. Оно понятно, что на сервере надо стараться работать с блоками данных, а не циклами, и по большому счету от бегунка кроме лишних тормозов толку особого нет - но из любопытства: может есть какой progressbar в T-sql или какой то маневр, чтобы его запустить на клиенте? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2015, 11:44 |
|
|
start [/forum/topic.php?all=1&fid=60&tid=2155711]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 287ms |
total: | 422ms |
0 / 0 |