【问题标题】:Parameterized query in Classic Asp经典 Asp 中的参数化查询
【发布时间】:2011-10-04 21:48:10
【问题描述】:

我的数据库访问代码如下:

set recordset = Server.CReateObject("ADODB.Recordset")
set cmd1  = Server.CreateObject("ADODB.Command")
cmd1.ActiveConnection = Conn //connection object already created
cmd1.CommandText = "SELECT * FROM lbr_catmaster where catname = ?"
cmd1.CommandType = adCmdText
set prm = cmd1.CreateParameter("@prm", 200, 1,200 , "development")
cmd1.Parameters.Append prm
set recordset = cmd1.Execute

但是没有数据库命中。请帮助解决这个问题。我使用的是 sql server 2005。

谢谢。

【问题讨论】:

  • 你在哪里说'连接对象已经创建' - 你能发布完整的代码吗?您是否正确打开连接?您是否收到任何错误消息,或者只是一个空记录集? (你是否使用 On Error Resume Next?)
  • @DylanBeattie:我知道这一点是因为当我从查询中简单地删除参数部分和“where 子句”时,它会返回记录。我也在使用 sql profiler 来检查它,但没有命中到 db。没有显示错误消息。
  • adCmdText 是否在任何地方定义?您没有按名称引用任何其他 ADO 常量。
  • @CheranS:是的,它被定义为 Const adCmdText = &H0001
  • 我认为,如果它甚至没有命中数据库,可能是它给出了错误但它被抑制了?但是当我将参数名称“@prm”代替“?”时,它会给出错误。在我的查询中..有什么方法可以知道发生了什么?

标签: vbscript asp-classic ado


【解决方案1】:

在我的代码中,这是我从命令中获取记录集的方式:

Set rs = server.createobject("ADODB.Recordset")
Set cmd = server.createobject("ADODB.Command")

cmd.ActiveConnection = Conn //connection object already created
cmd.CommandText = "SELECT * FROM lbr_catmaster where catname = ?"
cmd.CommandType = adCmdText
cmd.CommandTimeout = 900 

set prm = cmd.CreateParameter("@prm", 200, 1, 200, "development")
cmd.Parameters.Append prm

' Execute the query for readonly
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenForwardOnly, adLockReadOnly

希望对你有帮助

【讨论】:

  • 不需要创建额外的对象变量prm,只需将ParameterAppend() 的构建组合到Parameters 集合中。喜欢Call cmd.Parameters.Append(cmd.CreateParameter("@prm", adVarChar, adParamInput, 200)),然后使用cmd.Parameters("@prm").Value = "development"设置值。
  • @Lankymart:这些只是基于OP代码的示例,这里的重要部分是如何打开记录集
  • 任何阅读者的后续行动 - “set prm...”行中的“cmd1”应为“cmd”。但我不能进行少于 6 个字符的编辑。
【解决方案2】:

我喜欢使用Parameters.Refresh,即

set recordset = Server.CReateObject("ADODB.Recordset")
set cmd1  = Server.CreateObject("ADODB.Command")
cmd1.ActiveConnection = Conn //connection object already created
cmd1.CommandText = "SELECT * FROM lbr_catmaster where catname = ?"
cmd1.CommandType = adCmdText
cmd1.Prepared = True ' only needed if u plan to reuse this command often
cmd1.Parameters.Refresh
cmd1.Parameters(0).Value = "development"
set recordset = cmd1.Execute

【讨论】:

    【解决方案3】:

    您的查询中似乎没有正确引用您的命名参数。

    尝试替换:

    cmd1.CommandText = "SELECT * FROM lbr_catmaster where catname = ?"
    

    与:

    cmd1.CommandText = "SELECT * FROM lbr_catmaster where catname = @prm"
    

    看看有没有帮助。

    【讨论】:

    • 我也试过这个,但是出现了一个错误,上面写着“必须声明标量变量@prm”
    • @Dylan:这是 ADO.net 中的语法,而不是经典 ADO 中的语法
    • @Lankymart:使用 @prn 它和 ado.net 功能
    【解决方案4】:

    尝试省略参数名称:

    set prm = cmd1.CreateParameter(, 200, 1,200 , "development")
    

    【讨论】:

      【解决方案5】:

      如果您有一个使用参数的复杂标准,这是我必须根据我的要求创建的示例

          declare @loc smallint = ? , @dt1 date = ? SET @loc = ISNULL(@loc, 999) 
          SELECT m.* , c.*
          FROM Costs c INNER JOIN MbrData m ON c.SN = m.SN and c.startDT = m.startDT 
          WHERE (m.LocationID = @loc OR @loc = 999) AND (MonthYear = @dt1 OR @dt1 IS NULL) 
          ORDER BY m.LocationID
      

      然后在你的 asp 中

          cmd.CommandText = strSQL ' the string above
      cmd.CommandType = 1 ' adCmdText
      cmd.Parameters.Append cmd.CreateParameter("@loc",2,1) 'adSmallInt=2, adParamInput=1
      cmd.Parameters("@loc") = rptlocation ' scrubbed location ID
      cmd.Parameters.Append cmd.CreateParameter("@dt1",7,1) 'adDate=7, adParamInput=1
      cmd.Parameters("@dt1") = scrubbed formatted date
      set rst = cmd.Execute
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        相关资源
        最近更新 更多