【问题标题】:ASP parameters to call a stored procedure in SQL Server在 SQL Server 中调用存储过程的 ASP 参数
【发布时间】:2014-06-02 22:35:01
【问题描述】:

我尝试在插入数据的 SQL Server 中调用此存储过程。

我有这个:

CREATE PROCEDURE [dbo].[AddUser]
   @user_id bigint,
   @user_name varchar(20)
AS
BEGIN
   INSERT INTO [users] ([id], [name]) 
   VALUES (@user_id, @user_name)
END

我有这个 ASP 代码:

<%
Const adCmdStoredProc = 4
Const adBigInt = 20
Const adParamInput  = 1
Const adVarChar     = 200

Set conn = Server.CreateObject("ADODB.Connection")
connectionstring = "Provider=SQLOLEDB.1;Password=***********;Persist Security Info=True;User ID=sa;Initial Catalog=Test;Data Source=AREAWEB2-PC"
conn.Open connectionstring
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn

cmd.CommandType = adCmdStoredProc
cmd.CommandText = "{call AddUser (?,?)}"

frm_id = 1
frm_name = "Carlos"

Set prmUserId = cmd.CreateParameter("@user_id", adBigInt, adParamInput, 0, frm_id)
Set prmUserName = cmd.CreateParameter("@user_name", adVarChar, adParamInput, 20, frm_name)

Cmd.Parameters.Append prmUserId
Cmd.Parameters.Append prmUserName

Set rs = cmd.Execute 


%>

但我收到此错误消息:

Microsoft OLE DB Provider for SQL Server 错误“80040e10”

怎么了?

【问题讨论】:

    标签: sql-server parameters asp-classic ado


    【解决方案1】:

    如果您Google the error code 80040e10,很快就会发现问题与您的参数定义有关;

    来自Why do I get 80040E10 errors?

    用于 SQL Server 错误“80040e10”的 Microsoft OLE DB 提供程序
    过程 '' 需要参数 '',但未提供。

    您的问题可能是由于在 @user_id 参数中传递了 0 大小,因为所有参数都必须使用 .CreateParameter() 或在使用 .Size 属性将参数附加到集合之前传递最大大小。


    更新:

    作为OP has pointed out,问题实际上是由于设置了错误的CommandType 属性值。

    认为值得扩展答案以解释原因。原因是 OP 示例中的 CommandType 设置为 adCmdStoredProc.CommandText 属性未设置为存储过程名称,这是纠正此问题的最简单方法 (而不是删除 .CommandType就是把.CommandText改成如下;

    cmd.CommandText = "AddUser"
    

    另一个选项是将.CommandType 更改为adCmdText,这将接受{call AddUser (?,?)} 格式。

    cmd.CommandType = adCmdText
    

    在内部,ADO 使用 adCmdText 表示 adCmdStoredProc CommandTypeEnum,因为 .CommmandText 将更改为 {call AddUser (?,?)} 格式,不同之处在于您不能自己使用此表单,除非您指定 .CommandType = adCmdText。使用任何一个都没有额外的好处,但在我看来 adCmdStoredProc 只是简化了调用并隐藏了细节。

    【讨论】:

      【解决方案2】:

      代码失败,因为我有这些不正确:

      cmd.CommandType = adCmdStoredProc

      删除它,有效。

      【讨论】:

      • 那是因为您的 CommandText 不包含存储过程名称,这就是您收到参数错误的原因。要使 CommandText 工作,您必须使用 cmd.CommandType = adCmdText 或者您可以更改 cmd.CommandText = "addUser" 并保留 CommandType 原样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多