powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Когда command возвращает несколько рекордсетов
16 сообщений из 16, страница 1 из 1
Когда command возвращает несколько рекордсетов
    #32553805
Фотография neal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги!

Я столкнулся с такой проблемой:

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.
Public Function Create_spRecordset(CheckRecordCount As Byte, _
                                                 CmdName As String, _
                                                 IndentParams As Byte, _
                                                 Frm As Form, _
                                                 ByRef ADORS As ADODB.Recordset) as Long
' --CheckRecordCount = 1 проверять на пустой рекодсет, 0 - не проверять '
' --CmdName - имя хранимой процедуры '
' --IndentParams - какой режим формы (какой набор параметров считать у формы) '
' --Frm - ссылка на форму '
' --AdoRs - возвращаемый рекордсет '
    Dim Cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim Ers As ADODB.Errors
On Error GoTo Er
    Create_spRecordset =  0 
    Set Cmd = New ADODB.Command
    Cmd.CommandText = CmdName
    Cmd.CommandType = adCmdStoredProc
    Cmd.Prepared = False
    Set prm = Cmd.CreateParameter("RETVALUE", adInteger, adParamReturnValue)
    Cmd.Parameters.Append prm
    If Frm.GetParam(Cmd, IndentParams) Then '-- считываю параметры из данной формы '
        If (AdoCn Is Nothing) Then     
            InitConnection
        End If
        Set Cmd.ActiveConnection = AdoCn 
        Call Cmd.ActiveConnection.Errors.Clear
        ADORS.CursorLocation = adUseClient
        ADORS.CursorType = adOpenStatic
        ADORS.LockType = adLockReadOnly
        Set ADORS = Cmd.Execute     ' <--------- !!![/color] '
        Set ADORS.ActiveConnection = Nothing
        If ADORS.State = adStateClosed Then
            Set Ers = Cmd.ActiveConnection.Errors
            Set ADORS = Nothing
            Create_spRecordset = - 1 
            Call RegisterUserError(Cmd.Parameters( 0 ).Value, Ers, Frm.Name)
        End If
        If CheckRecordCount And ADORS.RecordCount =  0  Then
            Create_spRecordset = - 1 
            MsgBox "Нет записей!", vbCritical, "Результат"
        End If
    End If
Ex: Set Ers = Nothing
    Set prm = Nothing
    Set Cmd = Nothing
    Exit function
Er:
    Create_spRecordset = Err.NUMBER
'    Set Prm = Nothing '
'    Set Ers = Nothing '
'    Set CMD = Nothing '
    IF (MsgBox(Err.Number & "," & Err.Description & vbcrlf _
           "Продолжать?",vbYesNo) = vbYes) Then
           Resume Next
    Else 
           Resume Ex
    End if
End Function

В том же модуле:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private AdoCn As ADODB.Connection
 
Public Sub InitConnection()
    Set AdoCn = New ADODB.Connection
    AdoCn.CursorLocation = adUseClient
'    AdoCn.ConnectionString = "ODBC;Description=...;" _
        & "DRIVER=SQL Server;SERVER=...;DATABASE=...;" _
        & "LANGUAGE=us_english;Trusted_Connection=Yes;"   '
    AdoCn.ConnectionString = "SQLOLEDB.1;Description=...;" _
        & "DRIVER=SQL Server;SERVER=...;DATABASE=...;" _
        & "LANGUAGE=us_english;Trusted_Connection=Yes;"
    AdoCn.Open
End Sub

На той строке, которая выделена красным возникает ошибка:

Current provider does not support returning multiple recordsets from a single execution.

Как Вы видите пробовал разные коннекшены через OLEDB и ODBC.

Видимо у Command есть какой-то параметр, который отвечает за возврат множественного рекордсета или как проверить сколько рекодсетов собирается возвратить хранимая процедура и подставить ей Adors и создать еще один рекордсет и приклеить его в Adors.nextrecordset.

Хелп на работе покоцанный, поиск по форуму в первом приближении не нашел ничего по моей проблеме.

Вчера целый день мучался - мозги уже начинаю закипеть!

Может кто посмотрит свежим взглядом и подкинет идейку?
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32553836
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set ADORS = Cmd.Execute
метод Execute не возвращает ни чего !!!

надо использовать

Set ADORS = Cmd.OpenRecordSet

пробуй
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32553847
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из "некоцаного" хелпа
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)
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32553862
Фотография Ден
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32553873
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 paparome
Из того же хелпа
Syntax
For a Recordset-returning Command:

Set recordset = command.Execute( RecordsAffected, Parameters, Options )
Другое дело это будет необновляемый ,ForwartOnly Recordset
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32553899
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну все-все

Был не прав.
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32553954
Фотография neal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 all

Спасибо за ответы, попробовал.

И вот что оказалось - внутри функции AdoRs содержит два рекордсета
в первом показывает мне recordcount - 7
во втором - 5 как и должно быть

Но когда я его получаю в вызывающей форме, то в нем идет ошибка при доступе к NextRecordset

Код: plaintext
1.
2.
3.
4.
5.
    Dim Rs As New ADODB.Recordset
On Error GoTo Er
    If Create_spRecordset( 0 , "spSpecHierarhRS", IndentParams, Me, Rs) =  0  Then
         FillResTree  0 , Rs, Me!DetailTRee, BranchCode, ImgOffset
         FillResTree  0 , Rs.NextRecordset, Me!SpecTree, BranchCode, ImgOffset
...

Он возвращает только один рекордсет, теряя все остальные?

Прошу прощения, что немного ввел в заблуждения сразу.

2 paramone

авторнадо использовать

Set ADORS = Cmd.OpenRecordSet

ИМХО, Такого метода у Command нет, по крайней мере не нахожу по подсказкам, и получаю ошибку в runtime.
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32553988
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim Rs As New ADODB.Recordset
   On Error GoTo Er
   If Create_spRecordset( 0 , "spSpecHierarhRS", IndentParams, Me, Rs) =  0  Then
         FillResTree  0 , Rs, Me!DetailTRee, BranchCode, ImgOffset
         set Rs=Rs.NextRecordset 
        FillResTree  0 , Rs, Me!SpecTree, BranchCode, ImgOffset
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32554020
Фотография neal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(c)VIG
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim Rs As New ADODB.Recordset
   On Error GoTo Er
   If Create_spRecordset( 0 , "spSpecHierarhRS", IndentParams, Me, Rs) =  0  Then
         FillResTree  0 , Rs, Me!DetailTRee, BranchCode, ImgOffset
         set Rs=Rs.NextRecordset 
        FillResTree  0 , Rs, Me!SpecTree, BranchCode, ImgOffset


К сожалению не катит.
Делаю так и с помощью нового рекордсета

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
   Dim Rs As New ADODB.Recordset
   Dim Rs2 as New Adodb.Recordset
   On Error GoTo Er
   If Create_spRecordset( 0 , "spSpecHierarhRS", IndentParams, Me, Rs) =  0  Then
         FillResTree  0 , Rs, Me!DetailTRee, BranchCode, ImgOffset
         set Rs2=Rs.NextRecordset 
        FillResTree  0 , Rs2, Me!SpecTree, BranchCode, ImgOffset

Все равно идет указанная в первом сообщении ошибка при .NextRecordset
когда я в форме.

Причем в глобальном модуле могу наделать сколько угодно рекордсетов из ADODB.NextRecordset, но вот если в качестве параметров функции указать два или три рекордсета, то они будут всегда обязательными параметрами, так как они возвращаемые (byref), что не очень хорошо для всех остальных форм, которые используют эту функцию Create_spRecordset.

Что посоветуете?
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32554027
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может опять не в тему, но скажу

авторто они будут всегда обязательными параметрами, так как они возвращаемые (byref)

Не всегда - ведь можно его как Optional описать?
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32554057
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты убрал
Set ADORS.ActiveConnection = Nothing
?
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32554067
Фотография neal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока сделал, так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function Create_spRecordset3(CheckRecordCount As Byte, CmdName As String, _
            IndentParams As Byte, Frm As Form, ByRef Rs1 As ADODB.Recordset, _
            ByRef Rs2 As ADODB.Recordset, ByRef Rs3 As ADODB.Recordset) As Long
    ...
        Set Rs1 = Cmd.Execute
        Set Rs2 = Rs1.NextRecordset
        Set Rs3 = Rs2.NextRecordset
        Set Rs1.ActiveConnection = Nothing
    ...

end function

Set Rs1.ActiveConnection = Nothing - не убрал, мне нужно соединение рекордсета сделать как можно короче по времени, потом отвязаться и работать в Offline.

И из этой формы вызываю Create_spRecordset3
из остальных Create_spRecordset.

Может не очень хорошо, но заработало как нужно.

Интересно это баг, что рекодсеты теряются при возрате из фунций/процедур?

А насчет Optional надо быть особенно осторожным, а особенно с byref!

Все конечно,ИМХО.
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32554245
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА насчет Optional надо быть особенно осторожным, а особенно с byref!

Ой, поясните мне пожалуйста, в чем должна осторожность проявляться, а то мож я программы не правильно пишу?
А они "гады" (программы) работают и не признаются, что я напортачил :(
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32554479
Фотография neal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда встречаются функции или процедуры с параметрами Optional, то компилятор проверяет набор фактических значений, которые передаются внутрь функции/процедуры по соответствию какому-нибудь из допустимых комбинаций и соответственно не бьет тревогу на этапе компиляции, как если бы все параметры были бы обязательными.

А потом Вы долго ищите ошибку почему функция иногда работает правильно, а иногда глючит.

Поэтому, ИМХО, Optional только в редких случаях, когда действительно этот параметр:
1)очевидно необязательный и имеет значение по умолчанию,
2)последний в конце списка параметров,
3)только один,
4)byval (хотя компилятор не ругнется на byref)

Если добавился новый аргумент у функции/процедуры то компилятор сам найдет везде где она вызывается и заставит проставить значение, чем полагаться на авось.

Исключение: функции используемые в запросах - тут Optional пожалуйста!
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32554507
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэтому, ИМХО, Optional только в редких случаях, когда действительно этот параметр:
1)очевидно необязательный и имеет значение по умолчанию,

очевидно необязательный - у вас 2 rs из 3-х очевидно не обязательны
про значение по умолчанию не совсем понял :(
чем плохо отсутсвие параметра как такового?
или вам функция IsMissing не известна?

2)последний в конце списка параметров,
А вы его в середину и не вставите - о чем и говориться в справке

3)только один,
Это еще почему?
Стандартные функции нормально и с несколькими работают (взять например DoCmd.OpenForm)

4)byval (хотя компилятор не ругнется на byref)
А здесь в чем проблема?
...
Рейтинг: 0 / 0
Когда command возвращает несколько рекордсетов
    #32554554
Фотография neal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paparomeчем плохо отсутсвие параметра как такового?
или вам функция IsMissing не известна?

Для Вас неплохо - пожалуста, для меня плохо (не смогу уследить, а мне нужна надежность!)
Функцию IsMissing знаю уже много лет. Если в каком-то месте будет выгодно ее использовать - то я ее использую.

Вы спросили мое мнение - я Вам его высказал.
Все ИМХО без желания кого-то склонить к своему мнению.

Всем спасибо за идейную помощь и поддержку в борьбе с двух-трех головыми рекордсетами!!!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Когда command возвращает несколько рекордсетов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]