Stored procedures 3709尝试在经典ASP中调用存储过程时出错

Stored procedures 3709尝试在经典ASP中调用存储过程时出错,stored-procedures,vbscript,asp-classic,Stored Procedures,Vbscript,Asp Classic,我试图从一个经典的ASP应用程序调用一个存储过程,结果抛出了一个3709错误。这是一个无法连接的连接。。。错误 On Error Resume Next set ConnectionStr = "driver=SQL Server;server=***;uid=***;pwd=***;database=***" Set cmd = Server.CreateObject("ADODB.Command") With cmd Set .ActiveConnection = Connecti

我试图从一个经典的ASP应用程序调用一个存储过程,结果抛出了一个3709错误。这是一个无法连接的连接。。。错误

On Error Resume Next
set ConnectionStr = "driver=SQL Server;server=***;uid=***;pwd=***;database=***"

Set cmd = Server.CreateObject("ADODB.Command")
With cmd
    Set .ActiveConnection = ConnectionStr
    .CommandType = adCmdStoredProc
    .CommandText = "storedprocedure"  

    'Input Parameters
    .Parameters.Append .CreateParameter("@email", adVarchar, adParamInput, 50, Request.Form("email")) 
    .Parameters.Append .CreateParameter("@pass", adVarchar, adParamInput, 50, Request.Form("password")) 

End With 

set rs = Server.CreateObject("ADODB.RecordSet") 

'rs.Open cmd.Execute
set rs = cmd.Execute 'Here is 3709 Error

If not rs.eof Then 'I get a 3704 Error here because of the 3709 error above
    'Do Things with the RS
End If
Set cmd = Nothing

我的存储过程是:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[nameofprocedure]
    @email nvarchar(50),
    @pass nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON
    SELECT is, fstname, lstname, [password]
    FROM users
    WHERE email = @email AND [password] = @pass;
    RETURN
END


您需要创建并打开一个连接。请尝试以下代码:

Set ConnectionStr = Server.CreateObject("ADODB.Connection")  
ConnectionStr.Open "driver=SQL Server;server=***;uid=***;pwd=***;database=***"

您可能希望将变量重命名为其他变量,因为它实际上不是一个连接字符串

ASP文件缺少对ADO数据对象的库引用

<!--METADATA
TYPE="TypeLib"
NAME="Microsoft ActiveX Data Objects 2.6 Library"
UUID="{00000206-0000-0010-8000-00AA006D2EA4}"
VERSION="2.6"
-->

错误原因是
ConnectionStr
是字符串变量而不是对象变量,因此
Set
不应出现。你有两个选择

  • ConnectionStr
    的开头删除
    Set

    set ConnectionStr = "driver=SQL Server;server=***;uid=***;pwd=***;database=***"
    

  • 实例化一个对象变量在这种情况下,它将是一个
    ADODB.Connection
    ,您必须在传递连接字符串时调用
    Open()


  • 有用的链接
    • (如何构造对数据库的
      ADODB.Command
      调用的示例)

    您需要将
    ConnectionStr
    设置为连接对象而不是字符串。您的意思是当我设置活动连接时?无论我是自己管理连接还是将字符串传递给活动连接,它都会引发相同的错误。Command应该能够为我管理连接。我已经完成了:
    set Conn=Server.CreateObject(“ADODB.Connection”)
    Conn.open ConnectionStr
    并将其传递给活动连接以进行检查,同样的事情。如中所述,如果您多次使用连接,则只需保留连接对象。ADO可以处理传递的连接字符串而不是对象。我尝试使用ADODB.Connection对象,但得到了相同的结果。我从未尝试过这种技术。我想我学到了一些新东西!但是,我将验证您的连接字符串是否实际有效。听起来ADO无法创建连接。我几乎可以肯定我使用的是正确的连接字符串。我想知道是不是有什么安全问题阻止了我的连接?你以前遇到过这样的事情吗。我正在使用的不是我的系统,因此如果代码本身看起来不错,我想我需要询问某人权限和其他方面的工作方式。我想这也是可能的。这不是我遇到过的问题。@Wnanjo这是可能的,但如果将字符串声明为对象变量,则这是错误的
    设置StrConnection=“…”
    这是正确的,
    StrConnection=“…”
    Set
    专门用于设置对对象的引用,而不是字符串变量。这可能是真的,但不是原始错误的原因。问题是试图使用
    Set
    语句将字符串变量引用为对象引用。结果是几个错误的组合。更改集合并包含元数据完全解决了这个问题。
    ConnectionStr = "driver=SQL Server;server=***;uid=***;pwd=***;database=***"