|
|
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Коллеги! Я столкнулся с такой проблемой: Access 2000, MDB (DAO 3.6 и ADO 2.1) (Локальные таблицы, Прилинкованные таблицы, доступ к таблицам на SQL Server 2000 через хранимые процедуры) Есть форма с двумя TreeView, которая должна заполнится спомощью хранимой процедуры, возвращаюшей два рекордсета. Хр.Проц выполняется нормально - в QA вижу все оба рекордсета. Из Access'а вызываю ее, а как при ее выполнении указать что будет несколько рекордсетов и с помощью NextRecordset их собрать потом. Из форм вызываю универсальную процедуру: Код: 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. 55. 56. 57. 58. В том же модуле: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. На той строке, которая выделена красным возникает ошибка: Current provider does not support returning multiple recordsets from a single execution. Как Вы видите пробовал разные коннекшены через OLEDB и ODBC. Видимо у Command есть какой-то параметр, который отвечает за возврат множественного рекордсета или как проверить сколько рекодсетов собирается возвратить хранимая процедура и подставить ей Adors и создать еще один рекордсет и приклеить его в Adors.nextrecordset. Хелп на работе покоцанный, поиск по форуму в первом приближении не нашел ничего по моей проблеме. Вчера целый день мучался - мозги уже начинаю закипеть! Может кто посмотрит свежим взглядом и подкинет идейку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 11:38:14 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Set ADORS = Cmd.Execute метод Execute не возвращает ни чего !!! надо использовать Set ADORS = Cmd.OpenRecordSet пробуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 11:50:40 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Из "некоцаного" хелпа The NextRecordset method is not available on a disconnected Recordset object, where ActiveConnection has been set to Nothing (in Microsoft Visual Basic) or NULL (in other languages) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 11:53:59 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
2 paparome Syntax For a row-returning Command: Set recordset = command.Execute( RecordsAffected, Parameters, Options ) Для получения следующего рекордсета: Syntax Set recordset2 = recordset1.NextRecordset( RecordsAffected ) Return Value Returns a Recordset object. In the syntax model, recordset1 and recordset2 can be the same Recordset object, or you can use separate objects. Remarks Use the NextRecordset method to return the results of the next command in a compound command statement or of a stored procedure that returns multiple results. If you open a Recordset object based on a compound command statement (for example, "SELECT * FROM table1;SELECT * FROM table2") using the Execute method on a Command or the Open method on a Recordset, ADO executes only the first command and returns the results to recordset. To access the results of subsequent commands in the statement, call the NextRecordset method. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 11:58:33 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
2 paparome Из того же хелпа Syntax For a Recordset-returning Command: Set recordset = command.Execute( RecordsAffected, Parameters, Options ) Другое дело это будет необновляемый ,ForwartOnly Recordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 12:01:17 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Ну все-все Был не прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 12:09:56 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
2 all Спасибо за ответы, попробовал. И вот что оказалось - внутри функции AdoRs содержит два рекордсета в первом показывает мне recordcount - 7 во втором - 5 как и должно быть Но когда я его получаю в вызывающей форме, то в нем идет ошибка при доступе к NextRecordset Код: plaintext 1. 2. 3. 4. 5. Он возвращает только один рекордсет, теряя все остальные? Прошу прощения, что немного ввел в заблуждения сразу. 2 paramone авторнадо использовать Set ADORS = Cmd.OpenRecordSet ИМХО, Такого метода у Command нет, по крайней мере не нахожу по подсказкам, и получаю ошибку в runtime. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 12:27:06 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 12:40:19 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
(c)VIG Код: plaintext 1. 2. 3. 4. 5. 6. К сожалению не катит. Делаю так и с помощью нового рекордсета Код: plaintext 1. 2. 3. 4. 5. 6. 7. Все равно идет указанная в первом сообщении ошибка при .NextRecordset когда я в форме. Причем в глобальном модуле могу наделать сколько угодно рекордсетов из ADODB.NextRecordset, но вот если в качестве параметров функции указать два или три рекордсета, то они будут всегда обязательными параметрами, так как они возвращаемые (byref), что не очень хорошо для всех остальных форм, которые используют эту функцию Create_spRecordset. Что посоветуете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 12:50:36 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Может опять не в тему, но скажу авторто они будут всегда обязательными параметрами, так как они возвращаемые (byref) Не всегда - ведь можно его как Optional описать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 12:54:44 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
А ты убрал Set ADORS.ActiveConnection = Nothing ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 13:07:35 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Пока сделал, так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Set Rs1.ActiveConnection = Nothing - не убрал, мне нужно соединение рекордсета сделать как можно короче по времени, потом отвязаться и работать в Offline. И из этой формы вызываю Create_spRecordset3 из остальных Create_spRecordset. Может не очень хорошо, но заработало как нужно. Интересно это баг, что рекодсеты теряются при возрате из фунций/процедур? А насчет Optional надо быть особенно осторожным, а особенно с byref! Все конечно,ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 13:12:03 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
авторА насчет Optional надо быть особенно осторожным, а особенно с byref! Ой, поясните мне пожалуйста, в чем должна осторожность проявляться, а то мож я программы не правильно пишу? А они "гады" (программы) работают и не признаются, что я напортачил :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 14:10:26 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Когда встречаются функции или процедуры с параметрами Optional, то компилятор проверяет набор фактических значений, которые передаются внутрь функции/процедуры по соответствию какому-нибудь из допустимых комбинаций и соответственно не бьет тревогу на этапе компиляции, как если бы все параметры были бы обязательными. А потом Вы долго ищите ошибку почему функция иногда работает правильно, а иногда глючит. Поэтому, ИМХО, Optional только в редких случаях, когда действительно этот параметр: 1)очевидно необязательный и имеет значение по умолчанию, 2)последний в конце списка параметров, 3)только один, 4)byval (хотя компилятор не ругнется на byref) Если добавился новый аргумент у функции/процедуры то компилятор сам найдет везде где она вызывается и заставит проставить значение, чем полагаться на авось. Исключение: функции используемые в запросах - тут Optional пожалуйста! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 15:14:07 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
Поэтому, ИМХО, Optional только в редких случаях, когда действительно этот параметр: 1)очевидно необязательный и имеет значение по умолчанию, очевидно необязательный - у вас 2 rs из 3-х очевидно не обязательны про значение по умолчанию не совсем понял :( чем плохо отсутсвие параметра как такового? или вам функция IsMissing не известна? 2)последний в конце списка параметров, А вы его в середину и не вставите - о чем и говориться в справке 3)только один, Это еще почему? Стандартные функции нормально и с несколькими работают (взять например DoCmd.OpenForm) 4)byval (хотя компилятор не ругнется на byref) А здесь в чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 15:21:21 |
|
||
|
Когда command возвращает несколько рекордсетов
|
|||
|---|---|---|---|
|
#18+
paparomeчем плохо отсутсвие параметра как такового? или вам функция IsMissing не известна? Для Вас неплохо - пожалуста, для меня плохо (не смогу уследить, а мне нужна надежность!) Функцию IsMissing знаю уже много лет. Если в каком-то месте будет выгодно ее использовать - то я ее использую. Вы спросили мое мнение - я Вам его высказал. Все ИМХО без желания кого-то склонить к своему мнению. Всем спасибо за идейную помощь и поддержку в борьбе с двух-трех головыми рекордсетами!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 15:37:35 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32554027&tid=1673976]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 514ms |

| 0 / 0 |
