使用 SQL 参数 returns "Arguments are of the wrong type"

Using SQL parameters returns "Arguments are of the wrong type"

我在弄清楚如何编写经典 ASP 查询以防止 SQL 注入时遇到一些问题。

我已经阅读了一些关于它的帖子并提出了以下脚本;

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

SQL = "Select * From tablename Where Email Like ? And Deleted=0"

cmd.ActiveConnection = conn
cmd.CommandText = qText
cmd.CommandType = adCmdText
cmd.CommandTimeout = 900
cmd.Parameters.Append cmd.CreateParameter("@name", adVarchar, adParamInput, 50, "%" & this.Form("email") & "%")

Set rs = cmd.Execute

但每次我 运行 它时,我都会收到以下错误;

ADODB.Command error '800a0bb9'
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

我已按照此处的说明进行操作 https://vikaskanani.wordpress.com/2012/05/07/classic-asp-sql-injection-prevention-by-using-query-parameter/

如果您能帮助解决这个问题,我们将不胜感激。

adVarcharadCmdTextadParamInput是常量值,需要定义后才能使用。您可以通过多种方式执行此操作:

  1. 仅手动定义您需要的常量:

    const adVarChar = 200
    const adParamInput = &H0001
    const adCmdText = &H0001
    
  2. 直接使用值(这样可读性/维护性较差,一般不推荐):

    cmd.Parameters.Append cmd.CreateParameter("@name", 200, &H0001, 50, "%" & this.Form("email") & "%")
    
  3. 包含一个 adovbs.inc,它在一个方便的包含文件中定义了所有 ADO 常量:

     <!--#include virtual="/adovbs.inc"-->
    

    adovbs.inc 文件本身可以在网络上的许多地方下载(确保快速扫描它以检查它不包含任何令人讨厌的内容),4GuysFromRolla site成为流行的(下载 .txt 链接并将其重命名为 .inc

  4. 包括一个reference to the ADO TypeLib:

    <!--metadata type="TypeLib" name="Microsoft ActiveX Data Objects 2.8 Library" uuid="{2A75196C-D9EB-4129-B803-931327F72D5C}" version="2.8"-->