简体   繁体   English

调用存储过程,返回值,经典ASP我缺少什么?

[英]Calling stored procedure, returning value, classic ASP what am I missing?

My stored procedure: 我的存储过程:

CREATE PROCEDURE [dbo].[uspUserIsInGroup]
@username varchar(30),
@groupname varchar(30),
@ReturnCount int OUTPUT
    AS
    BEGIN
  SET NOCOUNT ON;

      SELECT @ReturnCount = count(*)
      FROM sys.database_role_members AS m
      INNER JOIN sys.database_principals AS dp
         ON m.member_principal_id = dp.principal_id
      INNER JOIN sys.server_principals AS l
         ON dp.[sid] = l.[sid]
      INNER JOIN sys.database_principals AS r
         ON m.role_principal_id = r.principal_id
      WHERE 1=1
      AND l.name = @username
      AND r.name = @groupname
  END

My asp code: 我的asp代码:

 Set cn = CreateObject("ADODB.Connection")
 Set cmd = CreateObject("ADODB.Command")
 cn.Open db
 Set cmd.ActiveConnection = cn
 cmd.CommandText = "uspUserIsInGroup"
 cmd.CommandType = 4 '4=adCmdStoredProc

 cmd.Parameters.Append cmd.CreateParameter("@username", 203, 1, 100, "peds\pss_admin")
 cmd.Parameters.Append cmd.CreateParameter("@groupname", 203, 1, 100, "rolePSS_admin")
 cmd.Parameters.Append cmd.CreateParameter("@ReturnCount", 200, 2, 255)
 cmd.Execute
 response.write "value returned is: " & cmd.Parameters(2).Value & "<br />"

I've tried: 我试过了:

 response.write "value returned is: " & cmd.Parameters(2).Value & "<br />"
 response.write "value returned is: " & cmd.Parameters(2) & "<br />"
 response.write "value returned is: " & cmd.Parameters("@ReturnCount").Value & "<br />"
 response.write "value returned is: " & cmd.Parameters("@ReturnCount") & "<br />"

I've tried with '@' and without. 我尝试过使用“ @”,而没有使用。 I've checked the permissions. 我已经检查了权限。 In call cases I get '0', but the value should be 1. 在通话情况下,我得到“ 0”,但该值应为1。

Running a trace on SQL, this is what's being run: 在SQL上运行跟踪,这是正在运行的:

declare @p3 int
set @p3=0
exec uspUserIsInGroup N'peds\pss_admin',N'rolePSS_admin',@p3 output
select @p3

Which does give a result of 1. 的确给出1的结果。

在此处输入图片说明

What am I doing wrong, what am I missing? 我做错了什么,我想念什么? Does it have any thing to do with the fact that when I run the code from the Trace, the result has "(No column name)"? 当我从Trace运行代码时,结果有“((无列名)”),这与事实有什么关系吗?

Thanks! 谢谢!

As discussed in the comments the result of your query can change according to the permissions of the logged in user. 如评论中所述,查询结果可以根据登录用户的权限进行更改。

You can use procedure signing if you don't want to grant the asp account the required permissions directly. 如果您不想直接授予asp帐户所需的权限,则可以使用过程签名

sys.database_principals states sys.database_principals状态

Any user can see their own user name, the system users, and the fixed database roles. 任何用户都可以看到自己的用户名,系统用户和固定的数据库角色。 To see other users, requires ALTER ANY USER, or a permission on the user. 要查看其他用户,需要ALTER ANY USER或该用户的权限。 To see user-defined roles, requires ALTER ANY ROLE, or membership in the role. 要查看用户定义的角色,需要具有ALTER ANY ROLE或角色成员身份。

sys.database_role_members states sys.database_role_members状态

Any user can view their own role membership. 任何用户都可以查看自己的角色成员身份。 To view other role memberships requires membership in the db_securityadmin fixed database role or VIEW DEFINITION on the database. 要查看其他角色成员身份,需要具有db_securityadmin固定数据库角色的成员身份或数据库上的VIEW DEFINITION。

sys.server_principals states sys.server_principals状态

Any login can see their own login name, the system logins, and the fixed server roles. 任何登录名都可以看到他们自己的登录名,系统登录名和固定服务器角色。 To see other logins, requires ALTER ANY LOGIN, or a permission on the login. 要查看其他登录名,需要ALTER ANY LOGIN或该登录名的权限。 To see user-defined server roles, requires ALTER ANY SERVER ROLE, or membership in the role. 要查看用户定义的服务器角色,需要具有ALTER ANY SERVER ROLE或角色成员身份。

cmd.Parameters.Append cmd.CreateParameter("@username", 203, 1, 100, "peds\\pss_admin") cmd.Parameters.Append cmd.CreateParameter("@groupname", 203, 1, 100, "rolePSS_admin") cmd.Parameters.Append cmd.CreateParameter("@ReturnCount", 200, 2, 255) cmd.Parameters.Append cmd.CreateParameter(“ @ username”,203,1,100,“ peds \\ pss_admin”)cmd.Parameters.Append cmd.CreateParameter(“ @ groupname”,203,1,100,“ rolePSS_admin”) cmd.Parameters.Append cmd.CreateParameter(“ @ ReturnCount”,200,2,255)

-should be- -应该-

cmd.Parameters.Append cmd.CreateParameter("@username", adVarChar, adParamInput, 30, "peds\pss_admin")
cmd.Parameters.Append cmd.CreateParameter("@groupname", adVarChar, adParamInput, 30, "rolePSS_admin")
cmd.Parameters.Append cmd.CreateParameter("@ReturnCount",adInteger,adParamOutput)

where adInteger = 3, adParamOutput = 2, adVarChar = 200 其中adInteger = 3,adParamOutput = 2,adVarChar = 200

so your statement output parameter using hard-coded numbers should read: 因此,使用硬编码数字的语句输出参数应为:

cmd.Parameters.Append cmd.CreateParameter("@ReturnCount", 3, 2)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM