sql - server createobject adodb command asp
Error al intentar llamar al procedimiento almacenado con una declaraciĆ³n preparada (2)
Así es como llama un procedimiento almacenado en ASP clásico:
''Set the connection
''...............
''Set the command
DIM cmd
SET cmd = Server.CreateObject("ADODB.Command")
SET cmd.ActiveConnection = Connection
''Set the record set
DIM RS
SET RS = Server.CreateObject("ADODB.recordset")
''Prepare the stored procedure
cmd.CommandText = "procName"
cmd.CommandType = 4 ''adCmdStoredProc
''Assign value to the parameter
cmd.Parameters("@ParamName ") = ParamValue
''Execute the stored procedure
RS = cmd.Execute
SET cmd = Nothing
''You can now access the record set
if (not RS.EOF) THEN
data = RS("column_name")
end if
''dispose your objects
RS.Close
SET RS = Nothing
Connection.Close
SET Connection = Nothing
Estoy tratando de usar una declaración preparada para llamar a un procedimiento almacenado (usando ADODB con ASP clásico), pero cuando configuro CommandType recibo el siguiente error:
ADODB.Command error ''800a0bb9''
Los argumentos son del tipo incorrecto, están fuera del rango aceptable o están en conflicto entre sí.
Tengo el siguiente código:
With Server.CreateObject("ADODB.Command")
.ActiveConnection = db ''this is initialized prior
.CommandType = adCmdStoredProc
.CommandText = "procName"
End With
El nombre de la declaración preparada es correcta (puedo llamarlo simplemente ejecutando la cadena), y si omito el .CommandType e intento llamar a .Execute, obtengo un error que especifica:
El procedimiento o la función ''procName'' espera el parámetro ''@ParamName'', que no se suministró.
Incluso si omito el CommandType, no tengo idea de cómo agregar realmente el parámetro (algo a lo largo de las siguientes líneas solo da como resultado el error original sobre argumentos del tipo incorrecto):
.Parameters.Append .CreateParameter("@ParamName",adVarChar,adParamInput,50,param)
También probé lo siguiente y obtuve el error "No se puede encontrar el artículo en la colección correspondiente al nombre solicitado u ordinal".
.Parameters.Refresh
.Parameters(0) = param
He visto varios ejemplos de cómo llamar a los procedimientos almacenados utilizando sentencias preparadas, y parece que estoy usando la sintaxis correcta, pero todo lo que intento parece dar como resultado algún tipo de error. Cualquier ayuda sería muy apreciada.
Desea algo como esto (no probado)
Dim cmd, rs, ars, conn
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
''Assuming passing connection string if passing ADODB.Connection object
''make sure you use Set .ActiveConnection = conn also conn.Open should
''have been already called.
.ActiveConnection = conn
''adCmdStoredProc is Constant value for 4 (include adovbs or
''set typelib in global.asa)
.CommandType = adCmdStoredProc
.CommandText = "dbo.procName"
''Define parameters in ordinal order to avoid errors
Call .Parameters.Append(.CreateParameter("@ParamName", adVarChar, adParamInput, 50))
''Set values using parameter friendly name
.Parameters("@ParamName").Value = param
''Are you returning a recordset?
Set rs = .Execute()
''Populate array with data from recordset
If Not rs.EOF Then ars = rs.GetRows()
Call rs.Close()
Set rs = Nothing
End With
Set cmd = Nothing
Es importante recordar que el nombre descriptivo (como regla yo tiendo a hacer coincidir los nombres de mis parámetros en mi procedimiento almacenado con mis nombres descriptivos en ADO) le das a tu parámetro nada significa para el procedimiento almacenado ya que ADO pasa los parámetros ordinalmente y nada más , el hecho de que obtengas el error;
El procedimiento o la función ''procName'' espera el parámetro ''@ParamName'', que no se suministró.
Sugiere que el procedimiento almacenado espera que el valor del parámetro @ParamName (definido en el procedimiento almacenado) se pase de ADO en una posición ordinal diferente, lo que generalmente significa que no ha definido todos sus parámetros o pasado todos los valores de los parámetros en la posición que son esperados.
También puede hacer una versión abreviada si confía en su posición ordinal y requisitos de parámetros
With cmd
.ActiveConnection = conn
.CommandType = adCmdStoredProc
.CommandText = "dbo.procName"
''Pass parameters as array following ordinal position.
Set rs = .Execute(, Array(param))
''Populate array with data from recordset
If Not rs.EOF Then ars = rs.GetRows()
Call rs.Close()
Set rs = Nothing
End With
Set cmd = Nothing
Trabajar con una matriz bidimensional es fácil y anula la sobrecarga de trabajar directamente con un ADODB.Recordset.
Dim row, rows
If IsArray(ars) Then
rows = UBound(ars, 2)
For row = 0 To rows
Response.Write "First column from row " & row & " = " & ars(0, row) & "<br />"
Next
Else
Response.Write "No data to return"
End If
Campo de golf
- Uso de METADATA para importar las constantes DLL : si tiene problemas con las constantes ADO (
adCmdStoredProc
etc.), esto lo arreglará por usted.