Нельзя использовать скобки при вызове Sub - PullRequest
0 голосов
/ 06 октября 2009

У меня есть классическая страница ASP, которая содержит следующий код для попытки параметризованного запроса:

<%
Set cmdEmail = Server.CreateObject("ADODB.Command")
Set rsEmail = Server.CreateObject("ADODB.Recordset")

cmdEmail.CommandText = "SELECT * FROM VWTenantPropertiesResults WHERE ContentID = ?"
cmdEmail.CommandType = 1
cmdEmail.ActiveConnection = MM_dbconn_STRING
cmdEmail.Parameters.Append
cmdEmail.CreateParameter("@ContentID", 3, 1, , request.Form("ContentID"))

rsEmail.Open cmdEmail
%>

Тем не менее, страница теперь сообщает о следующей ошибке;

Невозможно использовать скобки при вызове Sub /welcome/default2.asp, строка 436 cmdEmail.CreateParameter ("@ ContentID", 3, 1, request.Form (ContentID)) -------------------------------------------------- --------------------- ^

Это какая-то ошибка в ASP или мне нужно изменить способ выполнения параметризованных запросов?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 06 октября 2009

Разве вы не пропустили оператор "Set" там?

е:

<%
Set cmdEmail = Server.CreateObject("ADODB.Command")
Set rsEmail = Server.CreateObject("ADODB.Recordset")

UPDATE:

В ответ на комментарий Нила:

Спасибо, КрэйгТП. Это кажется создание экземпляра ADODB.Command и ADODB.Recordset, но возникают проблемы последние 4 строки кода.

Я думаю, что последние строки кода должны читать что-то вроде:

cmdEmail.CommandText = "SELECT * FROM VWTenantPropertiesResults WHERE ContentID = ?"
cmdEmail.CommandType = 1
cmdEmail.ActiveConnection = MM_dbconn_STRING
Set adoParam = cmdEmail.CreateParameter("@ContentID", 3, 1, , request.Form("ContentID"))
adoParam.Type = [the datatype of the parameter]
cmdEmail.Parameters.Append(adoParam)

Обратите внимание, что метод .CreateParameter вернет объект Parameter. Вы должны присвоить этот возвращенный объект переменной, которую затем используете в качестве параметра для метода .Append в коллекции Command объекта Parameters.

Смотрите эти ссылки для получения дополнительной информации:

Метод CreateParameter (ADO)
Сбор параметров (ADO)
Добавить метод (ADO)

Обратите внимание на раздел, озаглавленный «Коллекция параметров примечаний», где говорится:

Вы должны установить свойство Type Параметр объекта перед его добавлением в коллекцию параметров.

Свойство .Type объекта Parameter принимает значение из перечисления DataTypeEnum , чтобы указать тип данных параметра. Замените бит [the datatype of the parameter] моего кода выше на соответствующее значение типа enum.

ОБНОВЛЕНИЕ 2:

Извините, не заметил, что текст заголовка вопроса изменился!

Ах .. Старая классическая ошибка "Не могу использовать скобки при вызове Sub", а?

Ну, это объясняется здесь:

Невозможно использовать скобки при вызове Sub

В двух словах:

Вы вызвали подпрограмму без Оператор вызова, но используются скобки (). При вызове подпрограммы без оператор Call, не используйте Скобки.

Чтобы исправить эту ошибку:

  • Удалить скобки из вызова подпрограммы.
  • Используйте оператор Call для вызова подпрограммы.

Есть также сообщение от Эрика Липперта в блоге, в котором говорится об этой распространенной ошибке:

Что значит "нельзя использовать скобки?"

2 голосов
/ 06 октября 2009

Вы пытались просто убрать эти скобки?

cmdEmail.CreateParameter "@ContentID", 3, 1, , Request.Form("ContentID")

Насколько я помню, это всегда происходит, когда вы вызываете функцию и не используете ее возвращаемое значение.

ОБНОВЛЕНИЕ : Кажется, что настоящая проблема заключается в разрыве строки:


cmdEmail.Parameters.Append _     '' note this "_" character
    cmdEmail.CreateParameter("@ContentID", 3, 1, , Request.Form("ContentID"))
0 голосов
/ 06 октября 2009
set cmdEmail = Server.CreateObject("ADODB.Command")

Попробуйте установить несколько отладочных операторов, чтобы проверить, создает ли он экземпляр ADODB.Command.

, например

If (cmdEmail is Nothing) Then
   Response.Write("could not create the instance")
Else
   Response.Write("created the instance")
End If

Кроме того, удалите блок With и посмотрите, имеет ли это значение

dim paramContentID

cmdEmail.CommandText = "SELECT * FROM VWTenantPropertiesResults WHERE ContentID = ?"
cmdEmail.CommandType = 1
cmdEmail.ActiveConnection = MM_dbconn_STRING

set paramContentID = cmdEmail.CreateParameter("@ContentID", 3, 1, , request.Form("ContentID"))
cmdEmail.Parameters.Append paramContentID
...