ADO LIKE заявка в ASP (vbs)

Имам запитване като това:

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

person Alxandr    schedule 30.06.2010    source източник
comment
Сигурни ли сте за типа (adVarChar)?   -  person Fionnuala    schedule 30.06.2010
comment
Също така, вместо да посочите 255 като дължина, направете len(sok). Можете също така да добавите параметър в 1 ред код. Ето как винаги правя това: AdoCmd.Parameters.Append AdoCmd.CreateParameter(@name, adVarChar, adParamInput, Len(Name), Name)   -  person Rob    schedule 30.06.2010
comment
Да, adVarChar е правилен. И знам, че можете да го направите в един ред, но аз по-скоро добавих функция, която взема cmd, име, тип, дължина и стойност и прави това вместо мен. Намирам го за по-лесно за четене :)   -  person Alxandr    schedule 30.06.2010


Отговори (2)


ще работи за "нормални" sql изрази, подобни на това, което работи за съхранени процедури. трябва да зададете свойството CommandType на командния обект на adCmdText за "нормални" sql изрази И трябва да използвате 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
person ulluoink    schedule 22.07.2010

Можете да опитате да попълните колекцията Parameter с помощта на команда за опресняване.

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

Ще доведе до двупосочно пътуване до сървъра, но съвременните компютри трябва да се справят с това!

person Simmo    schedule 30.06.2010
comment
Първо, това не е съхранена процедура, така че ще работи ли? И второ, какво точно прави oCmd.Parameters.Refresh? Търси ли в заявката необходимите параметри? И трето, ако стане, мога ли да отпечатам този списък по някакъв начин? - person Alxandr; 01.07.2010
comment
Как се обаждате на SQL? Опресняването прави повикване към базата данни на SQL Server и изброява всички параметри, изисквани от съхранената процедура. - person Simmo; 01.07.2010