Ошибка 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 и изменили тег метаданных, чтобы он ссылался на нужную версию.

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