Dłubiąc dziś w SQL-u doszedłem co jest potrzebne do tego żeby kolekcja
parametrów w obiekcie typu ADODB.Parameters uzupełniła się sama po wpisaniu nazwy procedury. Trzeba mianowicie nadać prawo do wykonania EXECUTE userowi lub roli do obiektów
dbo.sp_ddopen oraz dbo.sp_sproc_columns.
uprawnienia dla użytkownika Guest
GRANT EXECUTE ON [dbo].[sp_ddopen] TO [guest] GRANT EXECUTE ON [dbo].[sp_sproc_columns] TO [guest] GO
uprawnienia dla roli Public
GRANT EXECUTE ON [dbo].[sp_ddopen] TO [public] GRANT EXECUTE ON [dbo].[sp_sproc_columns] TO [public] GO
Dzięki temu nie trzeba tworzyć kolekcji parametrów gdyż tworzy się sama
po podaniu nazwy procedury, dzięki czemu możemy podstawiać wartości bezpośrednio do istniejących elementów kolekcji
cmd.parameters("@par").value = "coś"
i są wszystkie parametry dostępne dla danej procedury łącznie z @return_value. Jak jest problem z uprawnieniami to tej kolekcji nie ma i trzeba sobie wszystkie parametry dodać ręcznie za pomocą konstrukcji:
cmd.Parameters.Append cmd.CreateParameter("@par", adChar, adParamInput, 50, "coś")
co jest niewygodne, lecz łatwe do osiągnięcia z poziomu kodu. Przydatne może być następujące zapytanie:
SELECT S.name AS [Schema], PR.name, PA.name AS ParmName, T.name AS ParType, PA.max_length, PA.precision, PA.scale, PA.is_output, PA.has_default_value FROM sys.parameters AS PA INNER JOIN sys.procedures AS PR ON PA.object_id = PR.object_id INNER JOIN sys.schemas AS S ON PR.schema_id = S.schema_id INNER JOIN sys.types AS T ON PA.system_type_id = T.system_type_id WHERE (PR.name = @RaportName) AND (S.name = @Schema)
Zwraca ono listę parametrów, które posiada procedura o nazwie zdefiniowanej w @RaportName i będącej w schemacie @Schema
Brak komentarzy:
Prześlij komentarz