【问题标题】:ADO LIKE query in ASP (vbs)ASP (vbs) 中的 ADO LIKE 查询
【发布时间】:2010-06-30 08:17:32
【问题描述】:

我有一个这样的查询:

SELECT TaFellesVaktjournal.*, TaBygg.ByggNavn
FROM TaFellesVaktjournal LEFT JOIN TaBygg ON
TaFellesVaktjournal.VaktFellesByggNavnId =
TaBygg.ByggBudsjtilstEiendom WHERE VaktjFellesDato
>= @dtfr AND VaktjFellesDato <= @dttl AND (VaktFellesSak
= @sok OR VaktjFellesHendelse = @sok) ORDER BY
VaktjFellesDato DESC, VaktjFellesTid DESC

但是,我收到一条错误消息,指出 No value given for one or more required parameters.。 我已经为@dtfr、@dttl 和@sok 指定了值。此外,如果我将包含 @sok 的部分(@dttl 之后的所有内容)删除到 ORDER BY,错误就会消失。

我已经确定我指定了 sok 的值,并且它不是空的。我什至尝试指定 2 个名为 sok 的参数(因为它们是两个地方)。有人知道我该怎么做吗?

我用来创建参数的代码如下:

Dim conn, cmd, param
set cmd = server.createobject("adodb.command")
set param = server.createobject("adodb.parameter")
set param = cmd.createparameter("@sok", adVarChar, adParamInput, 255, sok)
cmd.parameters.append param

【问题讨论】:

  • 您确定类型 (adVarChar) 吗?
  • 另外,不要指定 255 作为长度,而是执行 len(sok)。您也可以将参数添加到 1 行代码中。这就是我一直这样做的方式:AdoCmd.Parameters.Append AdoCmd.CreateParameter("@name", adVarChar, adParamInput, Len(Name), Name)
  • 是的,adVarChar 是正确的。而且我知道您可以在一行中完成,但我宁愿添加一个函数,它接受 cmd、名称、类型、长度和值,并为我做这件事。我觉得它更容易阅读:)

标签: asp-classic vbscript ado


【解决方案1】:

它适用于“正常”的 sql 语句,类似于它适用于存储过程。对于“普通”sql 语句,您必须将命令对象的 CommandType 属性设置为 adCmdText,并且您必须使用 q 问号“?”而不是参数名称。

您不需要刷新方法,ado 会自动为您执行此操作。 (它也只对存储过程有用)

dim sql
dim cmd : set cmd = server.createObject("ADODB.Command")
dim param, rs

sql = "SELECT TaFellesVaktjournal.*, TaBygg.ByggNavn" &_
      " FROM TaFellesVaktjournal" &_
      " LEFT JOIN TaBygg ON TaFellesVaktjournal.VaktFellesByggNavnId = TaBygg.ByggBudsjtilstEiendom" &_
      " WHERE VaktjFellesDato >= ?" &_
      " AND VaktjFellesDato <= ?" &_
      " AND (VaktFellesSak= ? OR VaktjFellesHendelse = ?)" &_
      " ORDER BY VaktjFellesDato DESC, VaktjFellesTid DESC"

cmd.ActiveConnection = conn
cmd.CommandType = adCmdText

set param = cmd.CreateParameter("dtfr", adVarChar, , 255, dtfr)
cmd.Parameters.Append param

set param = cmd.CreateParameter("dtfr2", adVarChar, , 255, dtfr)
cmd.Parameters.Append param

set param = cmd.CreateParameter("dttl", adVarChar, , 255, dttl)
cmd.Parameters.Append param

set param = cmd.CreateParameter("sok", adVarChar, , 255, sok)
cmd.Parameters.Append param

cmd.CommandText = sql

set rs = cmd.execute

set param = nothing
set cmd = nothing

【讨论】:

    【解决方案2】:

    您可以尝试使用刷新命令填充参数集合。

    Set cmd.ActiveConnection = oConn
    oCmd.CommandType=adCmdStoredProc
    oCmd.CommandText="ap_Your_spName"
    oCmd.Parameters.Refresh
    oCmd.Parameters("@dtfr") = dtfr
    oCmd.Parameters("@dttl") = dttl
    oCmd.Parameters("@sok") = sok
    oCmd.Execute
    

    会导致往返服务器,但现代计算机应该可以应付!

    【讨论】:

    • 首先它不是一个存储过程,所以这行得通吗?其次,oCmd.Parameters.Refresh 究竟做了什么?它是否在查询中查找所需的参数?第三,如果是这样,我可以以某种方式打印该列表吗?
    • 你是如何调用 SQL 的?刷新调用 SQL Server 数据库,并枚举存储过程所需的所有参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多