【问题标题】:Classic ASP - Stored Procedure Error经典 ASP - 存储过程错误
【发布时间】:2014-06-12 20:27:56
【问题描述】:

我编写了一个存储过程(“UpdateTable”),它接受一个参数并在运行时将新行插入到表中。

我在一个asp页面中有以下代码:-

dim conn
dim cmd

set conn = server.createobject("ADODB.Connection")
conn.open "Provider=SQLNCLI11;Data Source=(localdb)\Projects;Persist Security Info=False;Password=password;User ID=username;Initial Catalog=SQLLearning"

set cmd = server.createobject("ADODB.Command")

cmd.ActiveConnection = conn
cmd.CommandText = "UpdateTable"
cmd.CommandType =adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("Text",adVarChar,adParamInput, 100)

cmd("Text") = "Jessica"
cmd.Execute

当我运行它时,我收到以下错误:-

ADODB.Command 错误“800a0bb9”

参数类型错误、超出可接受范围或相互冲突。

/sp.asp,第 14 行

第 14 行是cmd.CommandType =adCmdStoredProc 行。我已经尝试了很多事情,包括声明一个名为 adCmdStoredProc 的常量,其值为 4,但这仍然不起作用。有人可以指出我正确的方向吗?

“UpdateTable”代码是:-

ALTER PROCEDURE UpdateTable
    @Text varchar(100)
AS
BEGIN

    SET NOCOUNT ON;
    INSERT INTO StoredProcTest (Text)
    OUTPUT inserted.ID, inserted.Text
    VALUES (@Text)
END
GO

【问题讨论】:

  • 粘贴UpdateTable过程
  • 还有一个建议;在您的存储过程中,这一行 INSERT INTO StoredProcTest (Text) 这里 Text 是一个保留字。尝试转义它说INSERT INTO StoredProcTest ([Text])
  • 可能很傻,但尝试使用Set cmd.ActiveConnection = conn,即添加“Set”,因为它是一个对象,试图在没有“Set”的情况下设置它可能会导致奇怪的问题。

标签: sql sql-server stored-procedures asp-classic


【解决方案1】:
Set cmd = Server.CreateObject("ADODB.Command")
    With cmd
        .ActiveConnection = conn
        .CommandType = adCmdStoredProc
        .CommandText = "UpdateTable"

        .Parameters.Append .CreateParameter("@Text",adVarChar,adParamInput, 100)
        .Parameters("@Text") = "Jessica"
        set rs = .Execute
    End With
set cmd = nothing

然后你应该能够得到类似的结果;

if not rs.eof then
    response.write rs("ID")
end if

【讨论】:

  • With 上的额外缩进是什么意思?另外,当您可以将连接字符串直接传递给ADODDB.Command.ActiveConnection 属性时,为什么还要打扰ADODB.Connection?这样,连接就使用Execute() 方法进行实例化,并在命令对象从内存中释放时释放。
  • With 上的额外缩进纯粹是一种编码风格——我个人觉得它更容易阅读。你能否在评论的第二部分澄清你的意思,因为我没有在我的例子中使用ADODB.Connection,除非你的意思是conn 对象?在我的脚本中,这是一个在页眉包含中创建并在页脚包含中销毁的对象 - 再次纯粹是个人编码风格。
  • 实际上,@Albofish 使用 ADODB.Connection 这样的方式并不理想,因为它破坏了连接池的处理能力;您正在锁定不使用的连接时间。最好越晚打开,越早关闭。至于With 上的缩进,你就在那里;没有功能上的区别。
  • @AndrewBarber 谢谢,我从来不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多