2011-12-08 16 views
5
Set rsPlanID = Server.CreateObject("ADODB.Recordset") 
rsPlanID.CursorLocation = adUseClient 

strSQL = "SELECT PlanID FROM ATTJournals WHERE ATTUserDataID = " & ATTUserDataID 
rsPlanID.Open strSQL, m_objConn, adOpenStatic, adLockOptimistic 

If Not rsPlanID.EOF Then 
    response.Write "New PlanID:" & rsPlanID("PlanID") 
End If 

El código anterior está en asp clásico.ADODB.Recordset error '800a0bb9': los argumentos son del tipo incorrecto

estoy consiguiendo el error siguiente:

ADODB.Recordset error '800a0bb9'
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

Dows Alguien sabe la causa de este error y cómo solucionarlo?

Respuesta

14

La mayoría como causa es que no se ha incluido "Adovbs.inc" o la META equavalent: -

<!--METADATA 
TYPE="TypeLib" 
NAME="Microsoft ActiveX Data Objects 2.6 Library" 
UUID="{00000206-0000-0010-8000-00AA006D2EA4}" 
VERSION="2.6" 
--> 

De ahí que no se dan las constantes adxxxx. Sin embargo, su error principal no incluye Option Explicit en la parte superior de la secuencia de comandos. Esto te ahorrará mucho tiempo cazando errores tontos y errores tipográficos.

BTW ¿Qué ocurre si ATTUserDataID contenía "0; BORRAR ATTJournales"; ?
Evite componer SQL utilizando concatenación como la peste. Busque "Inyección de SQL de ASP" para buscar ejemplos de uso de objetos de comandos parametrizados.

+0

¿Puedes poner esto en global.asa (es decir, un lugar, en lugar de cientos de archivos .asp)? – NealWalters

+1

@NealWalters Sí, de hecho lo recomendaría encarecidamente. – Lankymart

0

En primer lugar, cuando envié la aplicación con vbscript utilicé siempre los números para abrir un conjunto de registros. Recomiendo la siguiente línea:

rsPlanID.Open strSQL, m_objConn, 3, 3 

Asegúrese de incluir el archivo adovbs.inc primero. Los números están conectados a los diferentes tipos de propiedades del conjunto de registros. Y no comience a abrir la conexión de databse primero.

En segundo lugar, creo que no es necesario la línea

rsPlanID.CursorLocation = adUseClient 

thrird, consulta this thread. Tal vez es una buena plantilla para ti.

0

A menos que necesita para navegar hacia atrás y adelante en el conjunto de registros, sólo tiene que utilizar la configuración predeterminada:

strSQL = "SELECT PlanID FROM ATTJournals WHERE ATTUserDataID = " & ATTUserDataID 
Set rsPlanID = m_objConn.Execute(strSQL) 

Además, su código es abierto para los ataques de inyección SQL - es mejor aprender de ella y cambiar su código para usar Parámetros en su lugar.

-1
Function SQL_getRecordset(strQuery) 

'On Error Resume Next 
'Create Database connection object 
    Set objConnection = CreateObject("ADODB.Connection") 

    'Create Recordset object 
    Set objrecordset = CreateObject("ADODB.Recordset") 

    'Specify the connection string 
    strConnectionstring = "Provider=SQLOLEDB.1;Data Source=*<Server name>*;Initial Catalog=*<database>*;Integrated Security=SSPI" 
    objConnection.Open strConnectionstring 

    'Execute the Query 
    Set objrecordset = objConnection.Execute(strQuery) 

    'Return Recordset 
    Set SQL_getRecordset = objrecordset 

    'Release objects from the memory 
    Set objConnection = Nothing 
    Set objrecordset = Nothing 

End Function 
0

Siento que he buscado toda la Internet y no podía encontrar la solución a este problema, y ​​justo cuando estaba a punto de darse por vencido, me di cuenta que había declarado mi variable de conexión dentro de un "Si" declaración y porque la declaración if no se ejecutó tampoco mi comando a la base de datos dando el error como se menciona en su pregunta.

Cuestiones relacionadas