powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Выполнение хранимой процедуры с помощью Command
7 сообщений из 7, страница 1 из 1
Выполнение хранимой процедуры с помощью Command
    #32702770
Elena Gadjieva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Я вот мучаюсь над таким вопросом, впервые работая с хранимыми процедурами, поэтому мой вопрос может оказаться тривиальным.
При использовании объекта Command для получения выборки из хранимой процедуры запрос не поддерживает закладки (ADO_rs.Supports(adBookmark)=False) и перемещение (ado_rs.moveNext), хотя все параметры запроса, которые могут на это влиять, вроде бы заданы.

Хранимая процедура:

CREATE PROCEDURE MyProc @ID int AS
SELECT MyTable.ID FROM MyTable WHERE MyTable.ID=@ID
GO

Обработка результата в Access2000:

Public MyCnn As New ADODB.Connection
Public Ado_Rs As New ADODB.Recordset
Dim MyBookMark As Variant

1-й вар-т :
Ado_Rs.Open "Exec MyProc @ID=" & Me.ID, MyCnn, adOpenKeyset, adLockOptimistic, adCmdText

2-й вар-т (через Command):

Public Mycmd As New ADODB.Command
Public MyParam As New ADODB.Parameter

Mycmd.ActiveConnection = MyCnn
Mycmd.CommandType = adCmdStoredProc
Mycmd.CommandText = "MyProc"

MyParam.Direction = adParamInput
MyParam.Type = adInteger
MyParam.Size = 4
Mycmd.Parameters.Append MyParam
MyParam.Value = Me.ID

Ado_Rs.CursorType = adOpenKeyset
Ado_Rs.LockType = adLockOptimistic
Ado_Rs.Source = adCmdStoredProc

Set Ado_Rs = Mycmd.Execute


Далее для обоих вариантов

MyBookMark = Ado_Rs.Bookmark
Ado_rs.MovePrevious


1-й вариант работает, а второй нет :-( Вообще, каким образом лучше работать с набором записей, возвращаемых хранимой процедурой ?


Спасибо.
...
Рейтинг: 0 / 0
Выполнение хранимой процедуры с помощью Command
    #32702800
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм... а зачем во втором случае вы создаете какой-то объект Recordset, устанавливаете ему какие-то св-ва - если потом вы все равно делаете Set Ado_Rs = Mycmd.Execute, затирая тем самым ранее созданный объект со всеми его св-вами???

вместо этого надо
Код: plaintext
1.
Set Ado_Rs.Source = Mycmd
Ado_Rs.Open
...
Рейтинг: 0 / 0
Выполнение хранимой процедуры с помощью Command
    #32702901
Elena Gadjieva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно вар-т
Set Ado_Rs.Source = Mycmd
Ado_Rs.Open

работает. Но непонятно как быть со свойствами "тип курсора" и "тип блокировки", которые, по-моему, должны быть такими
Ado_Rs.CursorType = adOpenKeyset
Ado_Rs.LockType = adLockOptimistic,
тогда как если их не указать, то по умолчанию они будут равны adOpenForwardOnly и adLockReadOnly соответственно и по записи будет нельзя произвольно перемещаться и редактировать ее.

Кроме того, в чем тогда отличие между
1) Set Ado_Rs.Source = Mycmd
Ado_Rs.Open
и
2) Set Ado_rs = command.Execute ?

Почему тогда после 1)-го вар-та открытия запроса ADO_rs.movePrevious срабатывает, а после 2-го вар-та - выдает ошибку "Operation Is Not Allowed in this Context"
...
Рейтинг: 0 / 0
Выполнение хранимой процедуры с помощью Command
    #32702940
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но непонятно как быть со свойствами "тип курсора" и "тип блокировки", которые, по-моему, должны быть такими
Вот какими они должны быть - такими их и устанавливайте. Разумеется до открытия рекордсета

Кроме того, в чем тогда отличие между
1) Set Ado_Rs.Source = Mycmd
Ado_Rs.Open
и
2) Set Ado_rs = command.Execute ?
В том, что Execute возвращает Forward-Only Read-Only рекордсет. Который вы запоминаете поверх ранее настроенного Ado_Rs
А раз Forward Only - то MovePrevios вы сделать не можете. О чем вам и говорится.

Вообще непонятно - чего вам непонятно?
Вы же не удивляетесь, что после исполнения кода:
Код: plaintext
1.
2.
Dim SomeVariable As Long
SomeVariable =  1 
SomeVariable = SomeFuntction()
в переменной будет лежать совсем не обязательно первоначальное значение?
Ну а теперь вместо SomeVariable подставте Ado_Rs, а вместо SomeFunction - Mycmd.Execute, и перестаньте удивляться
...
Рейтинг: 0 / 0
Выполнение хранимой процедуры с помощью Command
    #32702947
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВот какими они должны быть - такими их и устанавливайте. Разумеется до открытия рекордсета
Можно и во время открытия. Главное - правильно установить.
...
Рейтинг: 0 / 0
Выполнение хранимой процедуры с помощью Command
    #32702954
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIGМожно и во время открытия
угу

VIGГлавное - правильно установить.
главное - не пользоваться Execute, которому пофигу на все, что до этого было установлено :)
...
Рейтинг: 0 / 0
Выполнение хранимой процедуры с помощью Command
    #32702983
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторглавное - не пользоваться Execute, которому пофигу на все, что до этого было установлено :)угу :)
Это я понял "давно тому назад" ,когда перешел на АДО. А так же то ,что xелпы пишут для того чтобы их читали.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Выполнение хранимой процедуры с помощью Command
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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