Ошибка ADODB.Parameters '800a0e7c' Объект параметра неправильно определен. Непоследовательная или неполная информация была предоставлена
Я в основном разработчик PHP, но у меня есть какой-то старый ASP, который один из наших предыдущих разработчиков сделал, и он не работает, и я не могу понять, как это исправить. У нас есть программа, которая отправляет некоторые переменные на страницу слушателя, которая сравнивает эти данные с регистрационными кодами базы данных msSQL, а затем сообщает программе, действителен ли регистрационный код.
Я получаю следующую ошибку, где
.Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x)
строка 134:
Ошибка ADODB.Parameters '800a0e7c'
Параметр объекта неправильно определен. Непоследовательная или неполная информация была предоставлена.
/checkregistrationpro.asp, строка 134
Я уже указал любые именованные константы во включаемом файле, которые я не включил в код, так что это не связано с этим.
Моя строка подключения (я уже проверил правильность этих настроек):
set conn = Server.CreateObject("ADODB.Connection")
set cmd = Server.CreateObject("ADODB.Command")
sConnString = "Provider=sqloledb; Data Source=MYDATASOURCE; Initial Catalog=MYCATALOG; User ID=MYUSERID; Password='MYPASSWORD';"
conn.Open sConnString
Мой код:
...
Function BlockInjectCode(StrVal)
BlockInjectCode = Replace(StrVal,"--","")
BlockInjectCode = Replace(BlockInjectCode,"'","")
BlockInjectCode = Replace(BlockInjectCode,"""","")
if instr(lcase(BlockInjectCode),"<") > 0 then
BlockInjectCode = ""
end if
End Function
x = BlockInjectCode(Request.QueryString("rid"))
uid = BlockInjectCode(Request.QueryString("uid"))
chkcode = BlockInjectCode(Request.QueryString("Code"))
CheckPro = BlockInjectCode(Request.QueryString("pro"))
CheckProProd = BlockInjectCode(Request.QueryString("prod"))
CheckProMac = BlockInjectCode(Request.QueryString("mac"))
MacAdd = CheckProMac
CodeValid = False
if x <> "" and uid <> "" then
'-- Get information about this registration code.
sqlStr = "select * from MYTABLE where Code = ? and IsValid = 1"
set cmdCodes = Server.CreateObject("ADODB.Command")
Set cmdCodes.ActiveConnection = Conn
cmdCodes.CommandText = sqlStr
with cmdCodes
.Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x)
end With
Set rsCodes = cmdCodes.execute
...
Проблема решена: я до сих пор не понимаю, почему adVarChar не работал, когда определялся вручную; однако человеческая ошибка случается. Создав файл global.asa для ссылки на msado15.dll, я смог решить проблему. См. Пост Ryios ниже для четких инструкций.
2 ответа
Обычное явление, скорее всего, у вас нет adVarChar
определены, поэтому CreateParameter()
метод "неправильно определен".
Это просто пример одной из многих именованных констант, найденных в библиотеке ADODB. Грязный подход к решению этой проблемы состоит в том, чтобы просто определить значение чего-то себе;
Const adVarChar = 200
Проблема с этим подходом заключается в том, что вам необходимо определить все именованные константы, которые могут быть головной болью. Другой подход состоит в том, чтобы просто пропустить целую вещь именованных констант и просто использовать целочисленные значения, так что вызов будет;
.Parameters.Append .CreateParameter("@code", 200, 1, 50, x)
Однако это не так легко прочитать, хотя кажется, что вы делаете это уже с ParameterDirectionEnum
ценность 1
которая является именованной константой adParamInput
в библиотеке ADODB. Несмотря на это, я бы не рекомендовал такой подход.
Немного лучший подход заключается в использовании #include
директива, так что она включает в вызывающей странице все определения именованных констант, которые вы можете захотеть, и именно так большинство это делают. Microsoft предоставляет предопределенный файл для этой цели с IIS (или, возможно, установка библиотеки MDAC, я не уверен, что у меня в голове), известный как adovbs.inc
или же adovbs.asp
, включив этот файл, ваша страница будет иметь доступ ко всем именованным константным определениям внутри.
Причиной всего этого является то, что VBScript не поддерживает библиотеки типов, поэтому в сценарии " Клиент", определяя их самостоятельно или копируя и вставляя из adovbs.inc
файл ваш единственный вариант. Однако в сценарии сервера у нас все еще есть возможности IIS, которые позволяют нам делать некоторые забавные вещи.
Разве не было бы неплохо, если бы библиотеку типов можно было просто добавить один раз, и вам не нужно об этом беспокоиться? Не надо называть раздражающих констант? Посмотрим правде в глаза, они уже существуют в библиотеке типов, так почему мы не можем получить их оттуда? Хорошо получается, что мы можем благодаря METADATA
директивы.
Вот пример;
<!--
METADATA
TYPE="TypeLib"
NAME="Microsoft ActiveX Data Objects 2.5 Library"
UUID="{00000205-0000-0010-8000-00AA006D2EA4}"
VERSION="2.5"
-->
Прелесть этого подхода в том, что вы можете использовать любую библиотеку типов (в идеале доступную для COM) и можете определить ее на одной странице или добавить в global.asa
чтобы определить во всем веб-приложении.
При таком подходе вы можете безопасно использовать подобный код;
.Parameters.Append .CreateParameter("@code", adVarChar, adParamInput, 50, x)
Полезные ссылки
В местах, где вы определяете adVarChar и другие магические числа ADO, избавьтесь от них полностью.
Вместо этого добавьте это в начало вашего global.asa (создайте его, если он не существует).
<!--METADATA TYPE="TypeLib" file="C:\Program Files (x86)\Common Files\System\ado\msado15.dll" -->
Это импортирует библиотеку типов msado15, в которой уже определены все эти магические числа. Он автоматически вытянет все определения для вас. Это означает, что вам не нужно определять adVarChar и т. Д., Тег метаданных автоматически импортирует их для вас. Благодарю @Lankymart за это, так как его комментарий привел меня к тому, что я это выяснил и выяснил, и это прекрасно работает.
Теперь включите создание пустой тестовой страницы asp и добавьте в нее тестовый код с включенной опцией.
<%
Option Explicit
Response.Write "adVarChar: " & adVarChar
%>
Если вы получаете сообщение об ошибке, что adVarChar не определен, то msado15.dll не на сервере. Поэтому вам нужно связаться с godaddy и т. Д., Чтобы они сказали вам путь к любой версии MSADO и изменили тег метаданных, чтобы он ссылался на нужную версию.