Передача параметров в хранимую процедуру с использованием ASP
Я пытаюсь передать некоторые параметры хранимой процедуре SQL в моем классическом ASP. Я видел несколько сообщений на эту тему и не уверен, что я делаю неправильно, потому что я не вижу своего расхождения.
set conn = CreateObject("ADODB.Connection")
conn.open ("DSN=SERVER;UID=username;PWD=pwd;Database=MyDatabase")
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = my_proc
cmd.Parameters.Refresh
cmd.Parameters(1) = "MyParam"
set rs = cmd.execute
Я получаю ошибку
Аргументы имеют неправильный тип, находятся за пределами допустимого диапазона или конфликтуют друг с другом.
на линии cmd.CommandType = adCmdStoredProc
, Я также попытался сделать это следующим образом с той же ошибкой
set conn = CreateObject("ADODB.Connection")
conn.open ("DSN=SERVER;UID=username;PWD=pwd;Database=MyDatabase")
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = my_proc
cmd.Parameters.Refresh
cmd.Parameters.Append cmd.CreateParameter("@MyParam, adVarWChar, adParamInput, 50, "test")
set rs = cmd.execute
3 ответа
Вы используете ADO через late binding
, что означает, что константы, как adCmdStoredProc
, adParamInput
и т.д. неизвестны вашему коду (поэтому они всегда равны 0).
Вы можете либо найти их и определить те, которые вам нужны, как константу в вашем коде (или использовать числа напрямую, но это не очень хорошо читается, если вы снова отредактируете код позже).
Или посмотрите здесь на msdn - вы можете найти файл, который определяет все константы вc:\Program Files\Common Files\System\ado\adovbc.inc
,
KekuSemau правильно, но позвольте мне предложить более эффективный и управляемый подход, чем использование adovbs
файл констант.
METADATA позволяет вам определять ссылку на константы DLL, даже если вы используете Late Binding, как в случае с классической средой ASP. Вероятно, стоит упомянуть, что вы можете добавить ссылки на METADATA на отдельных страницах, но с другой стороны, зачем вам это?
Чтобы использовать его просто добавьте тег METADATA к вашему global.asa
файл (должен находиться в корне вашего веб-приложения).
<!--
METADATA TYPE="typelib" FILE="C:\Program Files\Common Files\System\ADO\msado20.tlb"
-->
В зависимости от системы библиотека типов ADO может отличаться, отрегулируйте FILE
приписывать соответственно.
Я использую этот подход во всех своих приложениях, главным образом для ссылки на константы в библиотеках типов ADO и CDO.
Библиотека типов ADO
<!-- METADATA TYPE="typelib" FILE="c:\program files\common files\system\ado\msado15.dll" -->
Библиотека типов CDO
<!-- METADATA TYPE="typelib" UUID="CD000000-8B95-11D1-82DB-00C04FB1625D" NAME="CDO for Windows 2000 Library" -->
Это примеры моих личных ссылок, расположение файлов может отличаться, тогда как UUID
атрибуты должны быть точно такими же.
ВАЖНЫЙ:
Не забудьте удалить любые ссылки на
adovbs
постоянный включаемый файл (adovbs.inc
или жеadovbs.asp
обычно) при использованииMETADATA
подход в вашемglobal.asa
или вы получитеИмя переопределено ошибкаТакже
METADATA
доступно только в IIS 4.0 и выше.
Полезные ссылки
- Использование METADATA для импорта констант DLL (рекомендуется для чтения)
Я думаю, что есть только очень маленький кусочек, который вы делаете неправильно:
set conn = CreateObject("ADODB.Connection")
conn.open ("DSN=SERVER;UID=username;PWD=pwd;Database=MyDatabase")
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = conn
cmd.CommandType = 4 ' adCmdStoredProc constant is not defined in your context
cmd.CommandText = my_proc
cmd.Parameters.Refresh
cmd.Parameters(1).value = "MyParam"
set rs = cmd.execute
Константы ADO, вероятно, не определены, а также (но не уверены) параметр должен быть назначен через его value
имущество.