Параметризованный запрос ADO не возвращает никакого результата

Я использую этот запрос, чтобы получить некоторые результаты из моего vbscript на классической странице asp, и он не возвращает никаких значений. Страница пустая, ошибок тоже нет. Любое предложение, пожалуйста?

dim cmd, admin_no
admin_no = request.QueryString("admin")

set cmd = server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
sql = ""
sql = sql & "DECLARE @admin_no int;"
sql = sql & "SELECT field1, field2 FROM mydb.mytable where admin_no = @admin_no"
cmd.CommandText = sql
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter("@admin_no", adInteger, adParamInput, , admin_no)

'response.write(cmd.Parameters(0))
'response.write(cmd.CommandText)

set rs = server.CreateObject("ADODB.Recordset") 
rs.Open cmd

person Pravi    schedule 22.03.2016    source источник


Ответы (1)


Проблема в том, что adCmdText использует заполнитель ? для передачи параметров, измените строку

sql = sql & "SELECT field1, field2 FROM mydb.mytable where admin_no = @admin_no"

to

sql = sql & "SELECT field1, field2 FROM mydb.mytable where admin_no = ?"

Если вы хотите передать именованные параметры в свой запрос, вариантов не так много, но этот маленький трюк полезен.

sql = ""
sql = sql & "DECLARE @admin_no int;"
sql = sql & "SET @admin_no = ?;"
sql = sql & "SELECT field1, field2 FROM mydb.mytable where admin_no = @admin_no"

Полезные ссылки

person user692942    schedule 22.03.2016
comment
Ура @Lankymart, кажется, это работает, но я действительно хотел передать имена параметров в статусе Sql, чтобы он был более читабельным, как мне этого добиться? когда я говорю имена параметров, я имею в виду в приведенном выше sql, я говорю ... где admin_no=@admin_no вместо admin_no=? - person Pravi; 22.03.2016
comment
@Pravi Я почти уверен, что вы не можете, ADO не поддерживает это. - person user692942; 22.03.2016
comment
@Pravi См. Можно ли использовать именованные параметры, если типом команды является adCmdText?. Я демонстрирую описанный здесь обходной путь в этом примере. - person user692942; 22.03.2016
comment
Я предполагаю, что для этого есть некоторые правила, имя поля должно совпадать с именем функции createParameter, я прав?? - person Pravi; 22.03.2016
comment
@Pravi В этих ссылках в конце моего ответа много информации. Но в основном, если вы не используете метод Refresh() с NamedParameters = True, вам нужно указать/добавить параметры в том порядке, в котором они появляются в SQL. - person user692942; 22.03.2016
comment
Если я воспользуюсь примером, показанным Чераном, т.е. можно ли использовать именованные параметры, если тип команды — adCmdText? Я получаю сообщение об ошибке поставщика Microsoft OLE DB для SQL Server «80040e14». Невозможно назначить значение по умолчанию для локальной переменной. - person Pravi; 22.03.2016
comment
@Pravi Это больше похоже на ошибку SQL Server, чем на ошибку Classic ASP, убедитесь, что используемый вами синтаксис верен. Должно быть DECLARE @admin_no AS INT, затем SET @admin_no = ?, тогда в остальной части SQL вы можете использовать @admin_no там, где это необходимо. - person user692942; 22.03.2016
comment
@Pravi Предоставили быстрый пример в ответе. - person user692942; 22.03.2016
comment
Если вы действительно хотите назвать свои параметры, как вы предлагаете, почему бы не переместить это в сохраненный процесс? У вас есть вся ясность именования, которую вы ищете, и вы сделали шаг к разделению уровня данных и бизнес-уровня. Это было бы беспроигрышным вариантом. - person Sean Lange; 22.03.2016
comment
спасибо, ребята, @Lankymart, вы ответили на мой вопрос, и Шон Ланж рассмотрит ваше предложение. Ваше здоровье - person Pravi; 22.03.2016