2010-06-30 48 views
0

我有这样的查询:在ASP(VBS)ADO LIKE查询

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 
+0

你确定这个类型(adVarChar)吗? – Fionnuala 2010-06-30 08:31:35

+0

另外,不要指定255作为长度,而要做len(sok)。您也可以在1行代码中添加参数。这是我总是这样做的:AdoCmd.Parameters.Append AdoCmd.CreateParameter(“@ name”,adVarChar,adParamInput,Len(Name),Name) – Rob 2010-06-30 08:39:47

+0

是的,adVarChar是正确的。我知道你可以在一行中做到这一点,但我宁愿添加一个函数,该函数需要cmd,名称,类型,长度和值,并且这会对我产生影响。我觉得它更容易阅读:) – Alxandr 2010-06-30 08:42:52

回答

0

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

你不需要刷新方法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 
0

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

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 

会招致往返服务器,但现代计算机应该应付它!

+0

首先它不是一个存储过程,所以这项工作?其次,oCmd.Parameters.Refresh究竟做了什么?是否在查询中查找所需的参数?第三,如果是这样,我能否以某种方式打印该列表? – Alxandr 2010-07-01 07:30:44

+0

你是怎么调用SQL的? 刷新调用SQL Server数据库,并枚举存储过程所需的所有参数。 – Simmo 2010-07-01 12:49:09