Классический именованный параметр ASP в параметризованном запросе: необходимо объявить скалярную переменную.

Я пытаюсь написать параметризованный запрос в ASP Classic, и мне начинает казаться, что я бьюсь головой о стену. Я получаю следующую ошибку:

Необходимо объявить скалярную переменную "@something".

Я бы поклялся, что это то, что делает линия приветствия, но, возможно, я что-то упускаю...

<% OPTION EXPLICIT %>
<!-- #include file="../common/adovbs.inc" -->
<%

    Response.Buffer=false

    dim conn,connectionString,cmd,sql,rs,parm

    connectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=.\sqlexpress;Initial Catalog=stuff"
    set conn = server.CreateObject("adodb.connection")
    conn.Open(connectionString)

    set cmd = server.CreateObject("adodb.command")
    set cmd.ActiveConnection = conn
    cmd.CommandType = adCmdText
    cmd.CommandText = "select @something"
    cmd.NamedParameters = true
    cmd.Prepared = true
    set parm = cmd.CreateParameter("@something",advarchar,adParamInput,255,"Hello")
    call cmd.Parameters.append(parm)
    set rs = cmd.Execute
    if not rs.eof then
        Response.Write rs(0)
    end if


%>

person My Alter Ego    schedule 07.07.2009    source источник


Ответы (3)


Вот пример кода из статьи библиотеки MSDN о предотвращении атак путем внедрения SQL. Я не могу найти исходный URL-адрес, но поиск ключевых слов в заголовке (Предотвращение SQL-инъекций в ASP) должен привести вас к нужному результату достаточно быстро. Надеюсь, этот реальный пример поможет.

strCmd = "select title, description from books where author_name = ?"
Set objCommand.ActiveConnection = objConn
objCommand.CommandText = strCmd
objCommand.CommandType = adCmdText
Set param1 = objCommand.CreateParameter ("author", adWChar, adParamInput, 50)
param1.value = strAuthor
objCommand.Parameters.Append param1
Set objRS = objCommand.Execute()

См. следующую страницу в MSDN, внизу, специально относящуюся к именованным параметрам.

пример MSDN

person Bork Blatt    schedule 07.07.2009
comment
Спасибо. Есть ли способ сделать это с именованными параметрами? - person My Alter Ego; 08.07.2009

В этом случае ADO будет ожидать вопросительные знаки вместо фактических имен параметров. Прямо сейчас SQL «выбрать @something» на самом деле не параметризован: он видит «@something» как (необъявленную) переменную SQL, а не как параметр. Измените строку CommandText на это:

cmd.CommandText = "select ?"

И я думаю, вы получите желаемый результат.

Удачи!

person Chris Nielsen    schedule 07.07.2009
comment
Ип. Мне удалось получить это право, а также. Но я бы очень хотел, чтобы именованный аспект работал, так как будет сложнее отслеживать порядок параметров, когда запросы или операторы станут более сложными. - person My Alter Ego; 08.07.2009
comment
Попробовав несколько вариантов этого, я также не смог найти решение. Я подозреваю, что использование именованных параметров будет работать только в том случае, если вы вызываете хранимую процедуру, а не отправляете команду SQL. - person Chris Nielsen; 15.07.2009

Я не уверен, для чего предназначен ваш запрос. Я также не уверен, что параметры разрешены в списке выбора. Раньше в MSDN (много лет назад, наверное) была приличная статья о том, где разрешены параметры в запросе, но сейчас я не могу ее найти.

OTTOMH, ваши попытки указать значения параметров для ADO выглядят правильными. Выполняется ли ваш запрос, если вы делаете что-то подобное?

SELECT 1 FROM sometable WHERE somefield = @something
person Chris Farmer    schedule 07.07.2009
comment
Он отлично работает со знаком вопроса, поэтому параметр может быть в списке выбора. Проблема та же, если я перемещаю параметр в предложение where. Смысл запроса в том, чтобы иметь кратчайший пример, который я мог бы придумать, чтобы другие могли с ним повозиться. - person My Alter Ego; 08.07.2009