vbscript - ADODB.Parameters error ''800a0e7c'' El objeto de parámetro no está definido correctamente. Se proporcionó información inconsistente o incompleta
asp-classic dllimport (2)
Soy principalmente un desarrollador de PHP, pero tengo un ASP antiguo que uno de nuestros desarrolladores anteriores hizo que se rompió y no puedo encontrar la manera de solucionarlo. Tenemos un programa que envía algunas variables a una página de escucha que compara esos datos con los códigos de registro y una base de datos msSQL y luego le informa al programa si el código de registro es válido.
Recibo el siguiente error donde
.Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x)
es la línea 134:
ADODB. Error de parámetros ''800a0e7c''
El objeto de parámetro está incorrectamente definido. Se proporcionó información inconsistente 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 que ver con eso.
Mi cadena de conexión (ya he verificado que esta configuración es correcta):
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 tengo claro por qué adVarChar no funcionaba cuando se definía manualmente; Sin embargo, se produce 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.
En los lugares donde está definiendo adVarChar y otros números mágicos de ADO, elimínelos por completo.
En su lugar, agregue esto a la parte superior de su global.asa (cree uno si no existe).
<!--METADATA TYPE="TypeLib" file="C:/Program Files (x86)/Common Files/System/ado/msado15.dll" -->
Esto importará la biblioteca de tipo msado15 que ya tiene todos esos números mágicos definidos. Atraerá todas las definiciones automáticamente. Esto significa que no tendrá que definir adVarChar, etc., la etiqueta de metadatos los importará automáticamente. Gracias a @Lankymart por esto, ya que su comentario me llevó a descubrir esto y resolverlo, y funciona muy bien.
Ahora, cree una página asp de prueba que esté vacía y agregue un código de prueba con la opción explícita 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, deberá ponerse en contacto con GoDaddy, etc. para que le indiquen la ruta a cualquier versión de MSADO que esté allí y cambie su etiqueta de metadatos para hacer referencia a la versión correcta.
Es probable que no haya definido
adVarChar
, por lo que el método
CreateParameter()
está
"incorrectamente definido"
.
Este es solo un ejemplo de una de las muchas constantes con nombre que se encuentran en la Biblioteca ADODB. Un enfoque desordenado para lidiar con esto es definir el valor usted mismo de alguna manera;
Const adVarChar = 200
El problema con este enfoque es que debe definir todas las constantes con nombre, lo que puede ser un dolor de cabeza. Otro enfoque es simplemente omitir todo el asunto de las constantes nombradas y solo 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 lo está haciendo con el valor
ParameterDirectionEnum
de
1
que es la constante
adParamInput
nombrada en la Biblioteca ADODB.
Independientemente, no recomendaría este enfoque.
Un enfoque ligeramente 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 mismo propósito con IIS
(o posiblemente la instalación de la biblioteca MDAC, no estoy seguro)
conocido como
adovbs.inc
o
adovbs.asp
, al incluir este archivo a su página tendría acceso a todas las definiciones constantes nombradas dentro.
La razón de todo esto es que VBScript no admite 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 que nos permite hacer algunas cosas extravagantes.
¿No sería bueno si la Biblioteca de tipos solo se pudiera agregar una vez y no tiene que preocuparse por eso ?, ¿no hay que molestar constantes para definir?
Seamos realistas, ya existen en la Biblioteca de tipos, ¿por qué no podemos obtenerlos desde allí?
Pues resulta que podemos gracias a la directiva
METADATA
.
Aquí hay un ejemplo;
<!--
METADATA
TYPE="TypeLib"
NAME="Microsoft ActiveX Data Objects 2.5 Library"
UUID="{00000205-0000-0010-8000-00AA006D2EA4}"
VERSION="2.5"
-->
La belleza de este enfoque es que puede usarlo para cualquier biblioteca de tipos
(idealmente expuesto a COM)
y puede definirlo en una página o agregarlo a
global.asa
para que se haya definido en toda la aplicación web.
Con este enfoque, puede usar código como;
.Parameters.Append .CreateParameter("@code", adVarChar, adParamInput, 50, x)
Enlaces útiles
- Programación VBScript ADO
- Respuesta a ASP 3.0 Declarar constantes ADO sin incluir ADOVBS.inc
- Respuesta para pasar parámetros a un procedimiento almacenado usando ASP
- Usando METADATA para importar constantes DLL