Usando Stonetworking Procedure en Classical ASP … ejecute y obtenga resultados

Traté de resolver esto todo el día, pero parece que no funciona para mí. Me gustaría ejecutar un command y devolver el resultado a un set de loggings.

El problema es una de dos cosas: o recibo una respuesta vacía o hay un problema con mi código. Sé con certeza que este command debería search algunas líneas del DB. Agregué response.write dentro del ciclo, pero nunca se imprimen.

Aquí está el código:

 Set conn = Server.CreateObject("ADODB.Connection") conn.open "PROVIDER=SQLOLEDB;DATA SOURCE=X;DATABASE=Y;UID=Z;PWD=W;" Set objCommandSec = CreateObject("ADODB.Command") With objCommandSec Set .ActiveConnection = Conn .CommandType = 4 .CommandText = "usp_Targets_DataEntry_Display" .Parameters.Append .CreateParameter("@userinumber ", 200, 1, 10, inumber) .Parameters.Append .CreateParameter("@group ", 200, 1, 50, "ISM") .Parameters.Append .CreateParameter("@groupvalue", 200, 1, 50, ismID) .Parameters.Append .CreateParameter("@targettypeparam ", 200, 1, 50, targetType) End With set rs = Server.CreateObject("ADODB.RecordSet") rs = objCommandSec.Execute while not rs.eof response.write (1) response.write (rs("1_Q1")) rs.MoveNext wend response.write (2) 

EDITADO Después de revisar el código, siguiendo la respuesta de @Joel Coehoorn, la solución es:

  set rs = Server.CreateObject("ADODB.RecordSet") rs.oppen objCommandSec 

en lugar de

 set rs = Server.CreateObject("ADODB.RecordSet") rs = objCommandSec.Execute 

Lo miré por unos minutos, y ha pasado mucho time desde que trabajé con el ASP clásico, pero vi tres cosas que ver:

  1. ¿Necesita Open la connection antes de llamar a objCommandSec.Execute ?
  2. ¿Puede intentar escribir un literal de cadena dentro del bucle, que no depende en absoluto en el set de loggings … solo que de hecho está recorriendo el código, para ver si los loggings vuelven al set de loggings.
  3. ¿Has revisado la fuente html para ver si html mal formado está ocultando los resultados? Recuerdo que esto sucedió varias veces con tablas en asp loops clásicos, donde los datos se ocultarían de alguna manera entre dos filas, o una label de tabla de cierre en el lugar incorrecto terminaría la tabla, y las filas posteriores no serían visibles.

Un par de consejos después de trabajar con asp-classic durante años

  1. No es necesario crear una ADODB.Connection pasar una cadena de connection directamente a la propiedad ADODB.Command object ADODB.Command . Esto tiene dos ventajas, no tienes instancia y abre otro object, y como el context está vinculado al ADODB.Command , se lanzará con Set objCommandSec = Nothing .
  2. Una razón común para .Execute devolución de un set de loggings cerrado se debe a SET NOCOUNT ON no se ha establecido en su Procedimiento almacenado de SQL, ya que INSERT o UPDATE generarán un recuento afectado de loggings y un set de loggings cerrado. Establecer SET NOCOUNT ON detendrá estas salidas y solo se devolverá el set de loggings esperado.
  3. Usar ADODB.Recordset para desplazarse por sus datos es excesivo a less que necesite retroceder y avanzar y admitir algunos de los methods less utilizados que no son necesarios para funciones estándar como mostrar un juego de loggings en la pantalla. En cambio, intente utilizar una Array .

     Dim conn_string, row, rows, ary_data conn_string = "PROVIDER=SQLOLEDB;DATA SOURCE=X;DATABASE=Y;UID=Z;PWD=W;" Set objCommandSec = CreateObject("ADODB.Command") With objCommandSec .ActiveConnection = conn_string .CommandType = 4 .CommandText = "usp_Targets_DataEntry_Display" .Parameters.Append .CreateParameter("@userinumber ", 200, 1, 10, inumber) .Parameters.Append .CreateParameter("@group ", 200, 1, 50, "ISM") .Parameters.Append .CreateParameter("@groupvalue", 200, 1, 50, ismID) .Parameters.Append .CreateParameter("@targettypeparam ", 200, 1, 50, targetType) Set rs = .Execute() If Not rs.EOF Then ary_data = rs.GetRows() Call rs.Close() Set rs = Nothing End With Set objCommandSec = Nothing 'Command and Recordset no longer needed as ary_data contains our data. If IsArray(ary_data) Then ' Iterate through array rows = UBound(ary_data, 2) For row = 0 to rows ' Return our row data ' Row N column 2 (index starts from 0) Call Response.Write(ary_data(1, row) & "") Next Else ' Nothing returned Call Response.Write("No data returned") End If 

Aunque es posible que esto no responda directamente la pregunta de OP, podría ayudar a otra persona a search una solución.

Recientemente tuve un trabajo de mantenimiento que me obligó a modificar algo en un código clásico ASP en ejecución (que no he escrito en años). Las llamadas a procedimientos se escribieron de la misma manera que OP y no fue así como lo hice en el pasado.

Aquí está la syntax que utilicé en el pasado y creo que es un poco más limpia que otras soluciones proporcionadas aquí.

El siguiente código muestra cómo leer un parámetro de salida, pasar parameters al procedimiento almacenado, pasar el valor nulo al parámetro, leer el recuento de loggings e iterar en RecordSet.

 dim conn, cmd, rs set conn = Server.CreateObject("ADODB.Connection") conn.Open "Driver={SQL Server};Server=servername;Uid=username;Pwd=password;Database=dbname;" set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = conn cmd.CommandType = adCmdStonetworkingProc cmd.CommandText = "procedurename" cmd.Parameters.Refresh cmd.Parameters("@nullparam") = null cmd.Parameters("@strparam") = "1" cmd.Parameters("@numparam") = 100 set rs = Server.CreateObject ("ADODB.RecordSet") rs.CursorLocation = adUseClient ' to read recordcount' rs.open cmd, , adOpenStatic, adLockReadOnly Response.Write "Return Value: " & cmd.Parameters("@RETURN_VALUE") & "<br />" Response.Write "Record count: " & rs.RecordCount & "<br />" while not rs.EOF ' or do whatever you like with data' Response.Write rs("colname") & "<br>" rs.MoveNext wend