Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Добрый день
Связка Access 2k3 с SQL2k
запускаю ХП, которая внутри содержит селект, следующим образом
Dim cmd As New ADODB.Command
    cmd.ActiveConnection = CurrentProject.Connection
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "AddCity"
    AddParam cmd, level, 10
    AddParam cmd, Me.Controls("name"), 50
    AddParam cmd, Me.socr, 10
    AddParam cmd, region, 2
    AddParam cmd, area, 3
    AddParam cmd, city, 3
    AddParam cmd, punkt, 3
    
    Dim rst As ADODB.Recordset
    Set rst = cmd.Execute
    rst.MoveFirst
    
AddParam - тривиальная функция, создает и добавляет строковый параметр для
на последней строчке акцесс ругается на попытку обратиться к закрытому рекордсету.
Сама процедура отрабатывает, и в профайлере ее видно и по данным, но рекордсет видимо
не возвращается. Как его вернуть?
До этого сходным образом работал в Delphi (ADO). там без дополнительных ухищрений возвращается набор данных при запуске ХП
27 фев 07, 08:38    [3835264]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
1. Текст процедуры покажите.

2. Так не коросе ?
Set rs = CurrentProject.Connection.Execute "exec AddCity '1', 'Name', 'Sokr', 'RG', 'ARR', 'CIT', 'PNK'"
27 фев 07, 09:44    [3835443]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
открыть рекодрсет
Guest
Описание ошибки ясно говорит, что нужно сделать - открыть рекордсет. Сделайте перед rst.MoveFirst rst.Open.
Кроме предложенного выше варианта создания рекордсета можно и так (можно использовать дополнительные параметры "тип курсора", "тип блокировки":
Set rst = New ADODB.Recordset
rst.Open "exec AddCity '1', 'Name', 'Sokr', 'RG', 'ARR', 'CIT', 'PNK'", CurrentProjectConnection, adOpenStatic,adLockPessimistic
27 фев 07, 10:13    [3835574]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
открыть рекодрсет
Описание ошибки ясно говорит, что нужно сделать - открыть рекордсет. Сделайте перед rst.MoveFirst rst.Open.

Предложенный автором вариант должен работать.
Возможно, процедура отрабатывает нормально, но записей не возвращает.
27 фев 07, 10:19    [3835599]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
открыть рекодрсет
Guest
Vsevolod V
открыть рекодрсет
Описание ошибки ясно говорит, что нужно сделать - открыть рекордсет. Сделайте перед rst.MoveFirst rst.Open.

Предложенный автором вариант должен работать.
Возможно, процедура отрабатывает нормально, но записей не возвращает.

собственно говоря, Вы правы. Я поторпился.
27 фев 07, 10:29    [3835651]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Пробовал разные варианты.
И такой
Dim rst As New ADODB.Recordset
    Dim StrSQL As String
    StrSQL = "exec sp_AddCity '" + level + "', '" + Me.Controls("name") + "', '" + Me.socr + _
                          "', '" + region + "', '" + area + "', '" + city + "', '" + punkt + "'"
    rst.Open StrSQL, CurrentProject.Connection, adOpenStatic, adLockPessimistic
и такой
...
NewID = CurrentProject.Connection.Execute(StrSQL).Fields(0)
и просто запускал из акцесса.
В любом случае она не возвращает ни одной записи.
Однако если посмотреть трейс в SQL Profiler, скопировать из него заветную строчку
exec sp_AddCity 'city', 'Мухосранск', 'г', '66', '000', '000', '000'
то при запуске в Query Analyser она она возвращает набор данных, одну запись(ID последней добавленной строки). Вообще в QA работает как надо
вот текст ХП, селекты в последних строках
create procedure sp_AddCity (
@level varchar(10), 
@name varchar(50),
@socr varchar(10),
@region varchar(2),
@area varchar(3)='000',
@city varchar(3)='000',
@punkt varchar(3)='000'
)
as
begin
	begin tran
	declare @id int
--сначала делаем вставку c фиктивным уникальным на момент вставки кодом,
--таблица будет блокирована, что нам и надо
	insert into Cities(name, socr, code, region, area, city, punkt)
	values (@name, @socr, '-1000000000', @region, @area, @city, @punkt)
	set @id = SCOPE_IDENTITY()
--затем обновляем код Cities.code и код какого-либо уровня (area, punkt...)
	declare @codepart varchar(3)
	set @codepart = dbo.fn_GetNextCityCode (@level, @region, @area, @city, @punkt) 
	if @level = 'area' 
	begin
		update Cities
		set code = @region+@codepart+@city+@punkt, area = @codepart
		where id = @id
	end
	else if @level = 'city' 
	begin
		update Cities
		set code = @region+@area+@codepart+@punkt, city = @codepart
		where id = @id
	end
	else if @level = 'punkt'
	begin 
		update Cities
		set code = @region+@area+@city+@codepart, punkt = @codepart
		where id = @id
	end
	else
	begin
                                --какого уровня добавляемый объект? Откат
		select -1
		rollback tran
	end
	if @@error=0 begin 	
		commit tran
		select @id as [ID]
	end else begin
		rollback tran
		select -1  as [ID]
	end
end


что интересно, когда делаешь пустую ХП, которая только SELECT -1 AS [ID], то она возвращает набор данных в акцесс. Но куда копать, не знаю.
Выход в данной ситуации есть - вместо рекордсета параметр OUTPUT, однако хотелось бы понять, в чем косяк
27 фев 07, 17:22    [3838855]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Кхе
Guest
Интересно вы понимаете что делает эта строчка ?
if @@error=0 begin 
27 фев 07, 17:47    [3839043]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Кхе
Guest
Опять же если работает в QA, а у вас нет. то возможно права разные в QA и в вашем приложении
27 фев 07, 17:49    [3839058]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
2Кхе
права одинаковые - windows autentification. Что делает указанная строчка, я также понимаю.
хотя здесь она не совсем на месте
27 фев 07, 19:55    [3839760]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Кроме того, процедура срабатывает в обоих случаях, запись вставляет. Только при одних и тех же значениях параметров, в QA возвращает набор, а в акцессе нет. На что здесь может не хватить прав?
if @@error=0 begin 	
		commit tran
		select @id as [ID]
	end else begin
		rollback tran
		select -1  as [ID]
	end
27 фев 07, 20:05    [3839800]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
для начала
Guest
SET NOCOUNT ON в начало процедуры
27 фев 07, 20:07    [3839804]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
SET NOCOUNT ON
результата не дает, судя по ВОЛ и не должно, по крайней мере никаких указаний на то. Это только отключение информ. сообщений. Они ведь не смешиваются с итоговым рекордсетом?
Действительность несколько иная - появился набор на выходе. Но он содержит пустое поле.
При выполнении в QA все нормально, есть значение
28 фев 07, 13:58    [3842889]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Артамонов
Guest
Matroz
SET NOCOUNT ON
результата не дает, судя по ВОЛ и не должно, по крайней мере никаких указаний на то. Это только отключение информ. сообщений. Они ведь не смешиваются с итоговым рекордсетом?
Действительность несколько иная - появился набор на выходе. Но он содержит пустое поле.
При выполнении в QA все нормально, есть значение

Если я не ошибаюсь, как раз таки должно давать эффект - и как правило дает - если в процедуре больше одной команды SQL. Т.е.
CREATE PROCEDURE dbo.MyProc
AS
CREATE TABLE #t (ID int)
INSERT INTO #t SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
SELECT * FROM #t
возвращает записи - но аксессная форма их не увидит. Из-за того, что первая команда записей не возвращает, получив об этом сообщение от сервера. Поэтому его нужно отключить:
ALTER PROCEDURE dbo.MyProc
AS
SET NOCOUNT ON
CREATE TABLE #t (ID int)
INSERT INTO #t SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
SELECT * FROM #t
28 фев 07, 14:10    [3842994]     Ответить | Цитировать Сообщить модератору
 Re: adp-проект, подхватить результат SELECT-а при выполнении ХП  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
Артамонов
Если я не ошибаюсь, как раз таки должно давать эффект - и как правило дает - если в процедуре больше одной команды SQL.

Не буду спорить, я по крайней мере считал (исходя из BOL) что такие особенности характерны только при работе с SQL через ODBC (акцесс использует OLE DB Provider ?)
Так или иначе не работает. Запись на выходе появилась, но содержит пустое значение. Если у кого были сходные траблы, поделитесь пожалуйста
1 мар 07, 07:54    [3846165]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить