Depurar procedimientos almacenados (VB)

por Scott Mitchell

Descargar PDF

Las ediciones de Visual Studio Professional y Team System permiten establecer puntos de interrupción y pasar a procedimientos almacenados dentro de SQL Server, haciendo que la depuración de procedimientos almacenados sea tan fácil como la depuración del código de la aplicación. En este tutorial se muestra la depuración directa de bases de datos y la depuración de aplicaciones de procedimientos almacenados.

Introducción

Visual Studio proporciona una experiencia de depuración enriquecida. Con algunas pulsaciones de tecla o clics del mouse, es posible usar puntos de interrupción para detener la ejecución de un programa y examinar su estado y flujo de control. Junto con el código de aplicación de depuración, Visual Studio ofrece compatibilidad con la depuración de procedimientos almacenados desde SQL Server. Del mismo modo que pueden establecerse puntos de interrupción dentro del código de una clase de código subyacente de ASP.NET o clase de capa lógica empresarial, también se pueden colocar dentro de los procedimientos almacenados.

En este tutorial veremos los procedimientos almacenados paso a paso desde el Explorador de servidores dentro de Visual Studio, además de cómo establecer puntos de interrupción que se ejecutan cuando se llama al procedimiento almacenado desde la aplicación de ASP.NET en ejecución.

Nota:

Desafortunadamente, los procedimientos almacenados solo se pueden introducir y depurar a través de las versiones Professional y Team Systems de Visual Studio. Si está utilizando Visual Web Developer o la versión estándar de Visual Studio, le invitamos a seguir leyendo mientras recorremos los pasos necesarios para depurar procedimientos almacenados, pero no podrá replicar estos pasos en su máquina.

Conceptos de depuración de SQL Server

Microsoft SQL Server 2005 se diseñó para proporcionar integración con Common Language Runtime (CLR), que es el entorno de ejecución que usan todos los ensamblados .NET. Por lo tanto, SQL Server 2005 admite objetos de base de datos administrados. Es decir, puede crear objetos de base de datos como procedimientos almacenados y funciones definidas por el usuario (UDF) como métodos en una clase de Visual Basic. Esto permite que estos procedimientos almacenados y UDF usen la funcionalidad en .NET Framework y desde sus propias clases personalizadas. Por supuesto, SQL Server 2005 también proporciona compatibilidad con objetos de base de datos T-SQL.

SQL Server 2005 ofrece compatibilidad de depuración con objetos de base de datos T-SQL y administrados. Sin embargo, estos objetos solo se pueden depurar a través de las ediciones Visual Studio 2005 Professional y Team Systems. En este tutorial examinaremos la depuración de objetos de base de datos T-SQL. En el tutorial siguiente se examina la depuración de objetos de base de datos administrados.

La entrada de blog Introducción a la depuración de T-SQL y CLR en SQL Server 2005 del Equipo de integración ClR de SQL Server 2005 resalta las tres maneras de depurar objetos de SQL Server 2005 desde Visual Studio:

  • Depuración directa de bases de datos (DDD): desde el Explorador de servidores, podemos entrar en cualquier objeto de base de datos T-SQL, como procedimientos almacenados y UDF. Examinaremos la DDD en el paso 1.
  • Depuración de aplicaciones: podemos establecer puntos de interrupción dentro de un objeto de base de datos y, a continuación, ejecutar nuestra aplicación ASP.NET. Cuando se ejecuta el objeto de base de datos, se alcanzará el punto de interrupción y se cambiará el control al depurador. Tenga en cuenta que, con la depuración de aplicaciones, no podemos depurar paso a paso por instrucciones a un objeto de base de datos desde el código de la aplicación. Debemos establecer explícitamente puntos de interrupción en esos procedimientos almacenados o UDF donde queremos que el depurador se detenga. La depuración de aplicaciones se examina a partir del paso 2.
  • Depuración desde un proyecto de SQL Server: las ediciones Visual Studio Professional y Team Systems incluyen un tipo de proyecto de SQL Server que se usa normalmente para crear objetos de base de datos administrados. Examinaremos el uso de proyectos de SQL Server y depuraremos su contenido en el siguiente tutorial.

Visual Studio puede depurar procedimientos almacenados en instancias locales y remotas de SQL Server. Una instancia local de SQL Server es aquella que se instala en la misma máquina que Visual Studio. Si la base de datos de SQL Server que usa no se encuentra en la máquina de desarrollo, se considera una instancia remota. En estos tutoriales se han usado instancias locales de SQL Server. La depuración de procedimientos almacenados en una instancia remota de SQL Server requiere más pasos de configuración que al depurar procedimientos almacenados en una instancia local.

Si usa una instancia local de SQL Server, puede empezar con el paso 1 y trabajar con este tutorial hasta el final. Sin embargo, si usa una instancia remota de SQL Server, primero deberá asegurarse de que, al depurar, ha iniciado sesión en la máquina de desarrollo con una cuenta de usuario de Windows que tenga un inicio de sesión de SQL Server en la instancia remota. Además, tanto este inicio de sesión de base de datos como el inicio de sesión de la base de datos usado para conectarse a la base de datos desde la aplicación de ASP.NET en ejecución deben ser miembros del rol sysadmin. Consulte la sección Depuración de objetos de base de datos T-SQL en instancias remotas al final de este tutorial para obtener más información sobre cómo configurar Visual Studio y SQL Server para depurar una instancia remota.

Por último, comprenda que la compatibilidad de depuración con objetos de base de datos T-SQL no es tan completa como la compatibilidad de depuración con aplicaciones .NET. Por ejemplo, no se admiten condiciones y filtros de punto de interrupción, solo hay disponible un subconjunto de las ventanas de depuración, no se puede usar Editar y continuar, la ventana Inmediato se representa como inútil, etc. Consulte Limitaciones de los comandos y características del depurador para obtener más información.

Paso 1: Depurar directamente un procedimiento almacenado

Visual Studio facilita la depuración directa de un objeto de base de datos. Echemos un vistazo a cómo usar la característica Depuración directa de bases de datos (DDD) para profundizar en el procedimiento almacenado Products_SelectByCategoryID en la base de datos Northwind. Como su nombre implica, Products_SelectByCategoryID devuelve información del producto para una categoría determinada; se creó en el tutorial Uso de procedimientos almacenados existentes para el Conjunto de datos con tipo de TableAdapters. Para empezar, vaya al Explorador de servidores y expanda el nodo de base de datos Northwind. A continuación, explore en profundidad la carpeta Procedimientos almacenados, haga clic con el botón derecho en el procedimiento almacenado Products_SelectByCategoryID y elija la opción Paso a paso por el procedimiento almacenado en el menú contextual. Esto iniciará el depurador.

Dado que el procedimiento almacenado Products_SelectByCategoryID espera un parámetro de entrada @CategoryID, se le pide que proporcione este valor. Escriba 1, que devolverá información sobre las bebidas.

Use the Value 1 for the <span class=@CategoryID Parameter" />

Figura 1: Usar el valor 1 para el parámetro @CategoryID

Después de proporcionar el valor para el parámetro @CategoryID, se ejecuta el procedimiento almacenado. Sin embargo, en lugar de ejecutarse hasta la finalización, el depurador detiene la ejecución en la primera instrucción. Observe la flecha amarilla en el margen, que indica la ubicación actual en el procedimiento almacenado. Puede ver y editar valores de parámetro a través de la ventana Inspección o si mantiene el puntero sobre el nombre del parámetro en el procedimiento almacenado.

The Debugger has Halted on the First Statement of the Stored Procedure

Figura 2: El depurador se ha detenido en la primera instrucción del procedimiento almacenado (Haga clic para ver la imagen de tamaño completo)

Para recorrer el procedimiento almacenado una instrucción cada vez, haga clic en el botón Paso a paso por encima de la barra de herramientas o presione la tecla F10. El procedimiento almacenado Products_SelectByCategoryID contiene una sola instrucción SELECT, por lo que al presionar F10 se recorrerá paso a paso por la instrucción única y se completará la ejecución del procedimiento almacenado. Una vez completado el procedimiento almacenado, su salida aparecerá en la ventana Salida y el depurador finalizará.

Nota:

La depuración de T-SQL se produce en el nivel de instrucción; no se puede realizar una depuración paso a paso en una instrucción SELECT.

Paso 2: Configurar el sitio web para la depuración de aplicaciones

Aunque la depuración de un procedimiento almacenado directamente desde el Explorador de servidores es útil, en muchos escenarios estamos más interesados en depurar el procedimiento almacenado cuando se llama desde nuestra aplicación de ASP.NET. Podemos agregar puntos de interrupción a un procedimiento almacenado desde Visual Studio y, a continuación, iniciar la depuración de la aplicación ASP.NET. Cuando se invoca un procedimiento almacenado con puntos de interrupción desde la aplicación, la ejecución se detendrá en el punto de interrupción y podemos ver y cambiar los valores de parámetro del procedimiento almacenado y recorrer sus instrucciones, como hicimos en el paso 1.

Para empezar a depurar procedimientos almacenados llamados desde la aplicación, es necesario indicar a la aplicación web de ASP.NET que se integre con el depurador de SQL Server. Para empezar, haga clic con el botón derecho en el nombre del sitio web en el Explorador de soluciones (ASPNET_Data_Tutorial_74_VB). Elija la opción Páginas de propiedades en el menú contextual, seleccione el elemento Opciones de inicio de la izquierda y active la casilla SQL Server en la sección Depuradores (vea la figura 3).

Check the SQL Server Checkbox in the Application s Property Pages

Figura 3: Active la casilla SQL Server en las páginas de propiedades de la aplicación (Haga clic para ver la imagen de tamaño completo)

Además, es necesario actualizar la cadena de conexión de base de datos usada por la aplicación para que la agrupación de conexiones esté deshabilitada. Cuando se cierra una conexión a una base de datos, el objeto SqlConnection correspondiente se coloca en un grupo de conexiones disponibles. Al establecer una conexión a una base de datos, se puede recuperar un objeto de conexión disponible de este grupo en lugar de tener que crear y establecer una nueva conexión. Esta agrupación de objetos de conexión es una mejora del rendimiento y está habilitada de forma predeterminada. Sin embargo, al depurar queremos desactivar la agrupación de conexiones porque la infraestructura de depuración no se restablece correctamente al trabajar con una conexión que se tomó del grupo.

Para deshabilitar la agrupación de conexiones, actualice NORTHWNDConnectionString en Web.config para que incluya la configuración de Pooling=false.

<connectionStrings>
    <add name="NORTHWNDConnectionString" connectionString=
        "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\NORTHWND.MDF;
            Integrated Security=True;User Instance=True;Pooling=false"
        providerName="System.Data.SqlClient" />
</connectionStrings>

Nota:

Una vez que haya terminado de depurar SQL Server a través de la aplicación de ASP.NET asegúrese de restablecer la agrupación de conexiones quitando la configuración Pooling de la cadena de conexión (o estableciéndola en Pooling=true).

En este momento, la aplicación de ASP.NET se ha configurado para permitir que Visual Studio depure objetos de base de datos de SQL Server cuando se invoca a través de la aplicación web. Todo lo que queda ahora es agregar un punto de interrupción a un procedimiento almacenado e iniciar la depuración.

Paso 3: Agregar un punto de interrupción y depuración

Abra el procedimiento almacenado Products_SelectByCategoryID y establezca un punto de interrupción al principio de la instrucción SELECT haciendo clic en el margen en el lugar adecuado o colocando el cursor al principio de la instrucción SELECT y presionando F9. Como se muestra en la figura 4, el punto de interrupción aparece como un círculo rojo en el margen.

Set a Breakpoint in the Products_SelectByCategoryID Stored Procedure

Figura 4: Establecer un punto de interrupción en el procedimiento almacenado de Products_SelectByCategoryID (Haga clic para ver la imagen de tamaño completo)

Para que un objeto de base de datos SQL se depure a través de una aplicación cliente, es imperativo que la base de datos esté configurada para admitir la depuración de aplicaciones. Cuando se establece por primera vez un punto de interrupción, esta configuración debe activarse automáticamente, pero es prudente volver a comprobarlo. Haga clic con el botón derecho en el nodo NORTHWND.MDF en el Explorador de servidores. El menú contextual debe incluir un elemento de menú activado denominado Depuración de aplicaciones.

Ensure that the Application Debugging Option is Enabled

Figura 5: Asegúrese de que la opción Depuración de aplicaciones esté habilitada

Con el conjunto de puntos de interrupción y la opción Depuración de aplicaciones habilitada, estamos listos para depurar el procedimiento almacenado cuando se llama desde la aplicación de ASP.NET. Para iniciar el depurador, vaya al menú Depurar y elija Iniciar depuración; para ello, presione F5 o haga clic en el icono de reproducción verde de la barra de herramientas. Esto iniciará el depurador e iniciará el sitio web.

El procedimiento almacenado Products_SelectByCategoryID se creó en el tutorial Uso de procedimientos almacenados existentes para Conjunto de datos con tipo de TableAdapters. Su página web correspondiente (~/AdvancedDAL/ExistingSprocs.aspx) contiene un control de GridView que muestra los resultados devueltos por este procedimiento almacenado. Visite esta página a través del explorador. Al llegar a la página, se alcanzará el punto de interrupción del procedimiento almacenado Products_SelectByCategoryID y se devolverá el control a Visual Studio. Al igual que en el paso 1, puede recorrer las instrucciones del procedimiento almacenado y ver y modificar los valores de parámetro.

The ExistingSprocs.aspx Page Initially Displays the Beverages

Figura 6: La página ExistingSprocs.aspx muestra inicialmente las bebidas (Haga clic para ver la imagen de tamaño completo)

The Stored Procedure s Breakpoint has been Reached

Figura 7: Se ha alcanzado el punto de interrupción del procedimiento almacenado (Haga clic para ver la imagen de tamaño completo)

Como se muestra en la ventana Inspección de la figura 7, el valor del parámetro @CategoryID es 1. Esto se debe a que la página ExistingSprocs.aspx muestra inicialmente productos en la categoría de bebidas, que tiene un valor CategoryID de 1. Elija una categoría diferente en la lista desplegable. Al hacerlo, se produce un postback y se vuelve a ejecutar el procedimiento almacenado Products_SelectByCategoryID. El punto de interrupción se vuelve a alcanzar, pero esta vez el valor @CategoryID del parámetro refleja el elemento de lista desplegable seleccionado s CategoryID.

Choose a Different Category from the Drop-Down List

Figura 8: Elegir una categoría diferente de la lista desplegable (Haga clic para ver la imagen de tamaño completo)

El parámentro The <span class=@CategoryID refleja la categoría seleccionada en la página web" />

Figura 9: El parámetro @CategoryID refleja la categoría seleccionada en la página web (Haga clic para ver la imagen de tamaño completo)

Nota:

Si el punto de interrupción del procedimiento almacenado Products_SelectByCategoryID no se alcanza al visitar la página de ExistingSprocs.aspx, asegúrese de que la casilla SQL Server se ha activado en la sección Depuradores de la página Propiedades de la aplicación de ASP.NET, que la agrupación de conexiones ha deshabilitado y que la opción Depuración de aplicaciones de la base de datos está habilitada. Si sigue teniendo problemas, reinicie Visual Studio e inténtelo de nuevo.

Depuración de objetos de base de datos T-SQL en instancias remotas

La depuración de objetos de base de datos a través de Visual Studio es bastante sencilla cuando la instancia de base de datos de SQL Server está en la misma máquina que Visual Studio. Sin embargo, si SQL Server y Visual Studio residen en máquinas diferentes, se requiere cierta configuración cuidadosa para que todo funcione correctamente. Hay dos tareas principales con las que nos enfrentamos:

  • Asegúrese de que el inicio de sesión usado para conectarse a la base de datos a través de ADO.NET pertenece al rol sysadmin.
  • Asegúrese de que la cuenta de usuario de Windows usada por Visual Studio en el equipo de desarrollo es una cuenta de inicio de sesión de SQL Server válida que pertenece al rol sysadmin.

El primer paso es relativamente sencillo. En primer lugar, identifique la cuenta de usuario usada para conectarse a la base de datos desde la aplicación de ASP.NET y, a continuación, desde SQL Server Management Studio, agregue esa cuenta de inicio de sesión al rol sysadmin.

La segunda tarea requiere que la cuenta de usuario de Windows que use para depurar la aplicación sea un inicio de sesión válido en la base de datos remota. Sin embargo, es probable que la cuenta de Windows con la que inició sesión en la estación de trabajo no sea un inicio de sesión válido en SQL Server. En lugar de agregar su cuenta de inicio de sesión determinada a SQL Server, una mejor opción sería designar algunas cuentas de usuario de Windows como cuenta de depuración de SQL Server. A continuación, para depurar los objetos de base de datos de una instancia remota de SQL Server, ejecutaría Visual Studio con esas credenciales de la cuenta de inicio de sesión de Windows.

Un ejemplo debe ayudar a aclarar las cosas. Imagine que hay una cuenta de Windows denominada SQLDebug dentro del dominio de Windows. Esta cuenta tendría que agregarse a la instancia remota de SQL Server como un inicio de sesión válido y como miembro del rol sysadmin. A continuación, para depurar la instancia remota de SQL Server desde Visual Studio, tendríamos que ejecutar Visual Studio como usuario de SQLDebug. Para ello, inicie sesión en nuestra estación de trabajo, vuelva a iniciar sesión como SQLDebug y, a continuación, inicie Visual Studio, pero un enfoque más sencillo sería iniciar sesión en nuestra estación de trabajo con nuestras propias credenciales y, a continuación, usar runas.exe para iniciar Visual Studio como el usuario de SQLDebug. runas.exe permite que una aplicación determinada se ejecute en el modo de una cuenta de usuario diferente. Para iniciar Visual Studio como SQLDebug, puede escribir la siguiente instrucción en la línea de comandos:

runas.exe /user:SQLDebug "%PROGRAMFILES%\Microsoft Visual Studio 8\Common7\IDE\devenv.exe"

Para obtener una explicación más detallada sobre este proceso, vea la guía de William R. VaughnHitchhiker s Guide to Visual Studio and SQL Server, Seventh Edition.

Nota:

Si la máquina de desarrollo ejecuta Windows XP Service Pack 2, deberá configurar el Firewall de conexión a Internet para permitir la depuración remota. En el artículo Cómo habilitar la depuración de SQL Server 2005, se indican dos pasos: (a) En el equipo host de Visual Studio, debe agregar Devenv.exe a la lista Excepciones y abrir el puerto TCP 135; y (b) En el equipo remoto (SQL), debe abrir el puerto TCP 135 y agregar sqlservr.exe a la lista Excepciones. Si la directiva de dominio requiere que la comunicación de red se realice a través de IPSec, debe abrir los puertos UDP 4500 y UDP 500.

Resumen

Además de proporcionar compatibilidad con la depuración para el código de aplicación .de NET, Visual Studio también proporciona una variedad de opciones de depuración para SQL Server 2005. En este tutorial hemos examinado dos de esas opciones: Depuración directa de bases de datos y depuración de aplicaciones. Para depurar directamente un objeto de base de datos T-SQL, busque el objeto a través del Explorador de servidores y haga clic con el botón derecho en él y elija Depurar paso a paso por instrucciones. Esto inicia el depurador y se detiene en la primera instrucción del objeto de base de datos, en cuyo punto puede recorrer las instrucciones del objeto y ver y modificar los valores de parámetro. En el paso 1, hemos usado este enfoque para profundizar en el procedimiento almacenado Products_SelectByCategoryID.

La depuración de aplicaciones permite establecer puntos de interrupción directamente dentro de los objetos de base de datos. Cuando se invoca un objeto de base de datos con puntos de interrupción desde una aplicación cliente (por ejemplo, una aplicación web de ASP.NET), el programa se detiene a medida que el depurador toma el control. La depuración de aplicaciones es útil porque muestra más claramente qué acción de aplicación hace que se invoque un objeto de base de datos determinado. Sin embargo, requiere un poco más de configuración e instalación que la depuración de Direct Database.

Los objetos de base de datos también se pueden depurar a través de proyectos de SQL Server. Examinaremos el uso de proyectos de SQL Server y cómo usarlos para crear y depurar objetos de base de datos administrados en el siguiente tutorial.

¡Feliz programación!

Acerca del autor

Scott Mitchell, autor de siete libros de ASP/ASP.NET y fundador de 4GuysFromRolla.com, ha estado trabajando con tecnologías web de Microsoft desde 1998. Scott trabaja como consultor independiente, entrenador y escritor. Su último libro es Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Puede ponerse en contacto con él vía mitchell@4GuysFromRolla.com. o a través de su blog, que se puede encontrar en http://ScottOnWriting.NET.