Передача параметров в хранимую процедуру с использованием 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 и выше.


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

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

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 имущество.

Другие вопросы по тегам