Запрос 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 «?» вместо имен параметров.

вам не нужен метод обновления, он сделает это автоматически. (это полезно только для хранимых процедур)

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

Вы можете попробовать заполнить коллекцию параметров с помощью команды обновления.

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