Sql server 2008 使用SQL Server 2008存储过程的经典asp insert表示我的参数太多,或者没有指定参数

Sql server 2008 使用SQL Server 2008存储过程的经典asp insert表示我的参数太多,或者没有指定参数,sql-server-2008,stored-procedures,asp-classic,parameters,Sql Server 2008,Stored Procedures,Asp Classic,Parameters,我已经很久没有做过任何经典的asp工作了,但最近我被要求去接一个别人一直在做的项目,这个项目一团糟 该站点的后端有一个SQL Server 2008数据库,我需要添加一条记录并检索自动标识列作为输出参数 cmd.Parameters.Append cmd.CreateParameter("MyValue", adVarChar, adParamInput, 10, Request.Form("MyValue")) 我的asp代码显示在这里 Call fncOpenData() Set cmd

我已经很久没有做过任何经典的asp工作了,但最近我被要求去接一个别人一直在做的项目,这个项目一团糟

该站点的后端有一个SQL Server 2008数据库,我需要添加一条记录并检索自动标识列作为输出参数

cmd.Parameters.Append cmd.CreateParameter("MyValue", adVarChar, adParamInput, 10, Request.Form("MyValue"))
我的asp代码显示在这里

Call fncOpenData()
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = oConn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "usp_ins_MyRecord"
cmd.Parameters.Refresh
cmd.Parameters.Append cmd.CreateParameter("@MyValue", adVarChar, adParamInput, 10)
cmd.Parameters("@MyValue") = Request.Form("MyValue")
cmd.Execute
我的存储过程是用这里的代码创建的

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE usp_ins_MyRecord
    @MyValue    varchar(10)
AS
BEGIN
    INSERT INTO [MyRecords]
    (
        [MyValue]
    )
    VALUES
    (
        @MyValue
    )
END
GO
现在,当我运行我的asp页面时,我得到以下错误

ODBC驱动程序的Microsoft OLE DB提供程序错误“80040e14”

[Microsoft][ODBC SQL Server驱动程序][SQL Server]过程或函数 usp_ins_MyRecord指定的参数太多

/MyPage.asp,行

如果我拆下这条线

cmd.Parameters.Refresh
我得到以下错误

ODBC驱动程序的Microsoft OLE DB提供程序错误“80040e14”

[Microsoft][ODBC SQL Server驱动程序][SQL Server]过程或函数 “usp_ins_MyRecord”需要参数“@MyValue”,但该参数不是 供应

/MyPage.asp,行

嗯,是的,是吗

如果我以任何其他方式更改代码以添加参数,例如

cmd.Parameters.Append cmd.CreateParameter("@MyValue", adVarChar, adParamInput, 10, Request.Form("MyValue")

我得到了与以前相同的错误,说明没有指定参数

我知道这项技术已经过时了,我真的希望我能使用.Net,但这是我必须使用的,但我在这方面做了很多工作,而且进展很快

有人能看出问题所在,或者解释为什么我在让ASP使用SQL Server 2008存储过程时遇到问题吗


谢谢。

ADODB参数集合中的刷新方法会自动将存储过程中的参数添加到命令中

使用刷新或使用CreateParameter单独添加参数

如果提供程序允许,可以使用刷新方法填充参数集合。事实上,如果您试图在集合为空时或在第一次调用Refresh之前访问该集合,ADO将自动调用Refresh来填充该集合。提供参数比调用提供者并从提供者处获取此信息更有效。您可以采取任何措施来减少对提供商的呼叫,这将提高性能。可以使用Append属性添加参数对象

参考:

更新

您还可以在创建参数时尝试删除@符号

cmd.Parameters.Append cmd.CreateParameter("MyValue", adVarChar, adParamInput, 10, Request.Form("MyValue"))

ADODB参数集合中的刷新方法会自动将存储过程中的参数添加到命令中

使用刷新或使用CreateParameter单独添加参数

如果提供程序允许,可以使用刷新方法填充参数集合。事实上,如果您试图在集合为空时或在第一次调用Refresh之前访问该集合,ADO将自动调用Refresh来填充该集合。提供参数比调用提供者并从提供者处获取此信息更有效。您可以采取任何措施来减少对提供商的呼叫,这将提高性能。可以使用Append属性添加参数对象

参考:

更新

您还可以在创建参数时尝试删除@符号

cmd.Parameters.Append cmd.CreateParameter("MyValue", adVarChar, adParamInput, 10, Request.Form("MyValue"))

尝试使用ADODB.Connection而不是ADODB.Command在asp经典代码中执行存储过程的更简单方法

Set con = Server.CreateObject( "ADODB.Connection" )
con.Open oConn

sql = "exec usp_ins_MyRecord @myValue='" & somevalue & "'"
Set RS = con.execute(sql)
然后向存储过程中添加一行,以获取最近添加的记录的标识

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE usp_ins_MyRecord
    @MyValue    varchar(10)
AS
BEGIN
    INSERT INTO [MyRecords]
    (
        [MyValue]
    )
    VALUES
    (
        @MyValue
    )

SELECT @@identity AS recordid
END
GO
然后你可以把它从记录集中拉回来

IF NOT RS.EOF THEN
  myRecordid = RS("recordid")
END IF

尝试使用ADODB.Connection而不是ADODB.Command在asp经典代码中执行存储过程的更简单方法

Set con = Server.CreateObject( "ADODB.Connection" )
con.Open oConn

sql = "exec usp_ins_MyRecord @myValue='" & somevalue & "'"
Set RS = con.execute(sql)
然后向存储过程中添加一行,以获取最近添加的记录的标识

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE usp_ins_MyRecord
    @MyValue    varchar(10)
AS
BEGIN
    INSERT INTO [MyRecords]
    (
        [MyValue]
    )
    VALUES
    (
        @MyValue
    )

SELECT @@identity AS recordid
END
GO
然后你可以把它从记录集中拉回来

IF NOT RS.EOF THEN
  myRecordid = RS("recordid")
END IF

我几乎在所有方面都处于相同的情况下…包括为什么我使用经典ASP以及在错误消息之间切换。 接受的响应有助于决定不使用cmd.Parameters.Refresh

好的,那么为什么我得到了预期参数错误,而它显然存在? 在我的情况下…我创建参数的行缺少CreateParameter调用的一部分:

我有:

cmd.Parameters.Append cmd。CreateParameter@PoNum,3,1,PONum'adInteger=3,adInputParam=1

我错误地认为我不需要为整数指定大小。 不过零号的似乎很管用。。。 所以当我在尺寸上加零时,事情就开始正常运转了

cmd.Parameters.Append cmd。CreateParameter@PoNum,3,1,0,PONum'adInteger=3,adInputParam=1

很抱歉,我没有使用adxxxxx常量…我在这里继承了一些代码,无法轻松转换为使用这些常量…因为在整个代码中,一些必要的常量
用作变量。我迫不及待地想回到DotNet。

我几乎在所有方面都处于相同的境地……包括我为什么使用经典ASP以及在错误消息之间切换。 接受的响应有助于决定不使用cmd.Parameters.Refresh

好的,那么为什么我得到了预期参数错误,而它显然存在? 在我的情况下…我创建参数的行缺少CreateParameter调用的一部分:

我有:

cmd.Parameters.Append cmd。CreateParameter@PoNum,3,1,PONum'adInteger=3,adInputParam=1

我错误地认为我不需要为整数指定大小。 不过零号的似乎很管用。。。 所以当我在尺寸上加零时,事情就开始正常运转了

cmd.Parameters.Append cmd。CreateParameter@PoNum,3,1,0,PONum'adInteger=3,adInputParam=1


很抱歉,我没有使用adxxxxx常量…我在这里继承了一些代码,无法轻松转换为使用这些常量…因为在整个代码中,一些必要的常量用作变量。我迫不及待地想回到DotNet。

你有没有试过把cmd.CommandType=adCmdStoredProc放在cmd.CommandText=usp_ins_MyRecord之后?你有没有试过把cmd.CommandType=adCmdStoredProc放在cmd.CommandText=usp_ins_MyRecord之后?…除了我同意这很容易受到攻击,但可以通过使用正确的数据类型对输入进行清理来保护,转义撇号等,并使用URLScan等工具在服务器级别保护querystring输入……但这很容易受到攻击,但可以通过清理输入、使用正确的数据类型、转义撇号等进行保护,并使用URLScan等工具在服务器级别保护querystring输入