【问题标题】:3709 error while trying to call Stored Procedure in Classic ASP尝试在经典 ASP 中调用存储过程时出现 3709 错误
【发布时间】:2017-11-29 17:25:54
【问题描述】:

我正在尝试从经典 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

【问题讨论】:

  • 您需要将ConnectionStr 设置为Connection 对象而不是字符串。
  • 你的意思是当我设置活动连接时?
  • 无论我是自己管理连接还是将字符串传递给 activeConnection,它都会引发相同的错误。 ADODB.Command 应该能够为我管理连接。我已经完成了:set Conn = Server.CreateObject("ADODB.Connection")Conn.open ConnectionStr 并将其传递给活动连接只是为了检查,同样的事情。

标签: stored-procedures vbscript asp-classic


【解决方案1】:

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

  1. ConnectionStr 的开头删除Set

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

    ConnectionStr = "driver=SQL Server;server=***;uid=***;pwd=***;database=***"
    
  2. 1234563是矫枉过正)。 Brian covers this in their answer.

有用的链接

【讨论】:

  • 原来是几个错误的组合。更改集合并包含元数据完全解决了问题。
【解决方案2】:

您需要创建并打开一个连接。试试这个代码:

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

您可能希望将您的变量重命名为其他名称,因为它并不是真正的连接字符串。

【讨论】:

  • ADO-API 中所述,如果您多次使用连接,则只需要持久化连接对象。 ADO 可以处理被传递的连接字符串而不是对象。我尝试使用 ADODB.Connection 对象,但结果相同。
  • 我从未尝试过这种技术。我想我学到了一些新东西!但是,我会验证您的连接字符串实际上是有效的。听起来 ADO 无法创建连接。
  • 我几乎可以肯定我使用了正确的连接字符串。我想知道是否有安全问题阻止了我的连接?你以前有没有遇到过这样的事情。我正在处理的不是我的系统,所以如果代码本身看起来不错,我想我需要向某人询问权限如何工作。
  • 我想这也是可能的。不过这不是我遇到的。
  • @Wnanjo 可以,但如果您将字符串声明为对象变量,这是错误的Set StrConnection = "..." 这是对的,StrConnection = "..."Set 专门用于设置对对象而不是字符串变量的引用。
【解决方案3】:

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

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

【讨论】:

  • 这可能是真的,但不是原始错误的原因。那里的问题是尝试使用 Set 语句将字符串变量引用为对象引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多