asp sql stored-procedures vbscript asp-classic adodb

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