El parámetro ADODB.Parameters ‘800a0e7c’ no está definido correctamente. Se proporcionó información incompleta o incoherente

Principalmente soy un desarrollador de PHP, pero tengo algo de ASP viejo, uno de nuestros desarrolladores anteriores lo rompió y no puedo encontrar la manera de solucionarlo. Tenemos un progtwig que envía algunas variables a una página de escucha que compara esos datos con los códigos de registro de una base de datos msSQL y luego le informa al progtwig si el código de registro es válido.

Me sale el siguiente error donde

.Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x) 

es la línea 134:

ADODB.Parameters error ‘800a0e7c’

El objeto del parámetro está definido incorrectamente. Se proporcionó información incompleta o incompleta.

/checkregistrationpro.asp, línea 134

Ya he especificado las constantes con nombre en un archivo de inclusión que no he incluido en el código, por lo que no tiene nada que ver con eso.

Mi cadena de conexión (ya he verificado que estas configuraciones son correctas):

 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 

Mi código:

 ... 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 ... 

Problema resuelto: todavía no estoy seguro de por qué adVarChar no estaba funcionando cuando se definió manualmente; sin embargo, ocurre un error humano. Al crear un archivo global.asa para hacer referencia a msado15.dll, pude solucionar el problema. Vea la publicación de Ryios a continuación para obtener instrucciones claras.

La ocurrencia común es probable que no tenga definido adVarChar , por lo que el método CreateParameter() está “definido incorrectamente” .

Este es solo un ejemplo de una de las muchas constantes que se encuentran en la Biblioteca ADODB. Un enfoque desordenado para lidiar con esto es simplemente definir el valor de algo así como;

 Const adVarChar = 200 

El problema con este enfoque es que debes definir todas las constantes con nombre que pueden ser un dolor de cabeza. Otro enfoque es omitir todo el asunto de las constantes nombradas y simplemente usar los valores enteros, por lo que la llamada sería;

 .Parameters.Append .CreateParameter("@code", 200, 1, 50, x) 

Sin embargo, esto no es fácil de leer, aunque parece que ya está haciendo esto con el valor ParameterDirectionEnum de 1 que es la constante llamada adParamInput en la biblioteca ADODB. De todos modos, no recomendaría este enfoque.

Un enfoque un poco mejor es usar una directiva #include para que incluya en la página de llamada todas las definiciones constantes nombradas que pueda desear y así es como la mayoría lo hace. Microsoft proporciona un archivo predefinido para este propósito con IIS (o posiblemente la instalación de la biblioteca MDAC de la que no estoy seguro) conocido como adovbs.inc o adovbs.asp , al incluir este archivo su página tendría acceso a todas las definiciones constantes nombradas dentro.

La razón de todo esto es que VBScript no es compatible con bibliotecas de tipos, por lo que en un escenario de Cliente, definirlas usted mismo o copiar y pegar desde el archivo adovbs.inc es su única opción. Sin embargo, en un escenario de servidor todavía tenemos el poder de IIS, lo que nos permite hacer algunas cosas funky.

¿No sería agradable si la biblioteca de tipos solo se pudiera agregar una vez y no tienes que preocuparte? ¿No hay constantes molestas que definir? Afrontémoslo, ellos ya existen en la biblioteca de tipos entonces, ¿por qué no podemos obtenerlos de allí? Bueno, resulta que podemos gracias a la directiva METADATA .

Aquí hay un ejemplo;

  

La belleza de este enfoque es que puede usar para cualquier biblioteca de tipos (idealmente expuesta a COM) y puede definirla en una página o agregarla a global.asa para haberla definido en toda la aplicación web.

Con este enfoque, entonces es seguro usar código como;

 .Parameters.Append .CreateParameter("@code", adVarChar, adParamInput, 50, x) 

Enlaces útiles

  • Progtwigción VBScript ADO
  • Respuesta a ASP 3.0 Declare las constantes de ADO sin incluir ADOVBS.inc
  • Respuesta a Pasar parámetros a un procedimiento almacenado utilizando ASP
  • Usando METADATA para importar las constantes DLL

En los lugares donde define adVarChar y otros números mágicos de ADO, deshágase de ellos por completo.

En su lugar, agregue esto a la parte superior de su global.asa (cree uno si no).

  

Esto importará la biblioteca de tipo msado15 que ya tiene definidos todos esos números mágicos. Recostackrá todas las definiciones automáticamente. Lo que significa que no tendrá que definir adVarChar, etc. usted mismo, la etiqueta de metadatos los importará automáticamente. Gracias a @Lankymart por esto, ya que su comentario me llevó a descubrirlo y descubrirlo, y funciona muy bien.

Ahora, crea una página asp de prueba que esté vacía y añádele un código de prueba con la opción explicita activada.

 < % Option Explicit Response.Write "adVarChar: " & adVarChar %> 

Si obtiene un error que adVarChar no está definido, entonces msado15.dll no está en el servidor. Por lo tanto, tendrá que ponerse en contacto con godaddy, etc., para que le indiquen la ruta a la versión de MSADO que esté allí y cambie su etiqueta de metadatos para que haga referencia a la versión correcta.