Cómo: Depurar una aplicación de base de datos de varios niveles
Este tema se aplica a:
Visual Studio Ultimate |
Visual Studio Premium |
Visual Studio Professional |
Visual Studio Express |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Este tema contiene código de ejemplo que muestra cómo depurar una aplicación de base de datos de varios niveles, y describe los pasos necesarios para depurar, partiendo del código de aplicación que reside en un cliente o aplicación de nivel intermedio, el código Transact-SQL de un objeto de base de datos que se ejecuta dentro de una instancia de SQL Server, a partir de SQL Server 2005.
Las transiciones entre el nivel de aplicación y el nivel de base de datos requieren un punto de interrupción en el nivel de destino; de lo contrario, el código se ejecutará sin detenerse cuando se intente ir al nivel.Sin embargo, las transiciones entre el código Transact-SQL y el código SQL CLR dentro del nivel de base de datos no necesitan puntos de interrupción que habiliten el paso de uno a otro.
En el ejemplo siguiente, se usa una aplicación de consola de C#, una tabla de base de datos de SQL Server denominada Currency y dos procedimientos almacenados para pasar de C# a Transact-SQL y viceversa.El propósito del ejemplo es mostrar estas transiciones; no se trata de un escenario empresarial real.
Se llama a dos procedimientos almacenados:
DeleteCurrency es un procedimiento almacenado de Transact-SQL que elimina una divisa que tiene un código de divisa determinado.
DeleteCurrencyDriver también es un procedimiento almacenado de Transact-SQL.Llama al procedimiento almacenado anterior con un parámetro de entrada que especifica el código de la divisa que se debe eliminar.
El código de la aplicación llama a ambos procedimientos almacenados pasando un parámetro de código de divisa.El procedimiento almacenado "non-driver" recibe una llamada desde dos contextos diferentes, desde DeleteCurrencyDriver y directamente desde la aplicación.En el primer contexto, podrá ir desde DeleteCurrencyDriver hasta los otros procedimientos almacenados haciendo clic en el botón Paso a paso por instrucciones.Si la llamada a los procedimientos almacenados se realiza desde la aplicación, no podrá entrar en ellos directamente, por lo que tendrá que establecer puntos de interrupción dentro de los propios procedimientos almacenados.
Crear los objetos de base de datos de Transact-SQL para esta demostración
En una base de datos de SQL Server 2005 o posterior, use el código del primer ejemplo para crear la tabla Currency y los dos procedimientos almacenados.
Abra el Editor de Transact-SQL en Visual Studio y conecte con la base de datos que puede usar para esta demostración.Para obtener más información, vea Cómo: Iniciar el Editor de Transact-SQL y Cómo: Conectar con una base de datos en el Editor de Transact-SQL.
Copie el código Transact-SQL del primer ejemplo y péguelo en el Editor de Transact-SQL.
Reemplace <database> por el nombre de la base de datos adecuado y, a continuación, haga clic en Ejecutar SQL en la barra de herramientas del Editor de Transact-SQL.
Si ha abierto el Editor de Transact-SQL en el contexto de un proyecto de base de datos o de servidor de SQL Server, cierre el proyecto antes de continuar.En caso contrario, puede dejar el Editor de Transact-SQL abierto y continuar.
Preparar el Explorador de servidores para la depuración de varios niveles
Asegúrese de que se ha habilitado la depuración de Transact-SQL para su equipo.Para obtener más información, vea Cómo: Habilitar la depuración de Transact-SQL.
Abra el Explorador de servidores; para ello, abra el menú Ver y haga clic en Explorador de servidores.
En el Explorador de servidores, cree una nueva conexión de datos haciendo clic con el botón secundario en Conexiones de datos y seleccionando Agregar conexión.Esto iniciará el cuadro de diálogo Agregar conexión.
Cree una conexión a la base de datos donde creó la tabla Currency.Es importante que el inicio de sesión que usa la conexión sea un miembro del rol fijo de servidor sysadmin.Para obtener más información, vea Cómo: Conectarse a una base de datos con el Explorador de servidores.
Una vez creada la nueva conexión de datos, búsquela debajo del nodo Conexiones de datos.
Haga clic con el botón secundario en la nueva conexión de datos y haga clic en Depuración de aplicación.Esto habilita la depuración de varios niveles en la base de datos especificada en la conexión.
Preparar la aplicación de consola de C# para la depuración de varios niveles
En la misma instancia de Visual Studio en la que preparó el Explorador de servidores, prepare una aplicación de consola de C# que ejecutará los procedimientos almacenados DeleteCurrencyDriver y DeleteCurrency.
Abra una nueva aplicación de consola de C#; para ello, abra el menú Archivo y haga clic en Nuevo proyecto.
Copie el código C# del segundo ejemplo y úselo para reemplazar todo el código del archivo Program.cs creado por el proyecto.
En las propiedades de la aplicación de consola, en la pestaña Depurar, active Habilitar depuración de SQL Server.Esto habilita la depuración de varios niveles para la aplicación de consola.Para obtener más información, vea Cómo: Habilitar la depuración de Transact-SQL para un proyecto de C++, Visual Basic o C#.
Depurar la aplicación de consola de varios niveles
En el código C# (el archivo Program.cs), coloque los puntos de interrupción antes y después de cada llamada a un procedimiento almacenado.
Coloque los puntos de interrupción en los procedimientos almacenados.Nota: no puede ir al código Transact-SQL desde el código C#, pero sí puede ir de un objeto de base de datos de SQL Server a otro.
En el Explorador de servidores, busque los nuevos procedimientos almacenados debajo de la nueva conexión de datos.
Haga clic con el botón secundario en el procedimiento almacenado DeleteCurrency y haga clic en Abrir.Esto iniciará una ventana del Editor de Transact-SQL con el procedimiento almacenado DeleteCurrency.Establezca un punto de interrupción en la línea SET NOCOUNT ON haciendo clic en la barra gris del lado izquierdo del Editor.
Haga clic con el botón secundario en el procedimiento almacenado DeleteCurrencyDriver y haga clic en Abrir.Esto iniciará una ventana del Editor de Transact-SQL con el procedimiento almacenado DeleteCurrencyDriver.Establezca un punto de interrupción en la línea SET NOCOUNT ON haciendo clic en la barra gris del lado izquierdo del Editor.
Ejecute la aplicación presionando F5.
Inicie la depuración paso a paso de los distintos módulos.
Pruebe a quitar algunos de los puntos de interrupción para ver el efecto de intentar pasar por los distintos niveles y lenguajes.
Para finalizar la depuración, borre todos los puntos de interrupción desde el menú Depurar de Visual Studio y presione F5.
Ejemplo
Esta sección contiene el código Transact-SQL que crea la tabla Currency y los dos procedimientos almacenados: DeleteCurrency y DeleteCurrencyDriver. Reemplace <database> por el nombre de la base de datos adecuada.
USE <database>
GO
CREATE TABLE Currency
(CurrencyCode nvarchar(1))
INSERT Currency
VALUES (N'A'),(N'B'),(N'C'),(N'D')
SELECT * FROM Currency
GO
CREATE PROCEDURE dbo.DeleteCurrency
(
@CurrencyCode nvarchar(3)
)
AS
SET NOCOUNT ON
DELETE Currency
WHERE CurrencyCode = @currencyCode
RETURN
GO
CREATE PROCEDURE dbo.DeleteCurrencyDriver
(
@CurrencyCode nvarchar(3)
)
AS
SET NOCOUNT ON
EXECUTE DeleteCurrency @CurrencyCode
RETURN
GO
Esta sección contiene el código C# de la aplicación de consola que llama a los procedimientos almacenados DeleteCurrencyDriver y DeleteCurrency.Reemplace <server> y <database> por la instancia del servidor y el nombre de la base de datos donde reside la tabla Currency, respectivamente.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = <server>;
builder.IntegratedSecurity = true;
builder.InitialCatalog = <database>;
SqlConnection SqlConnection1 = new SqlConnection(builder.ConnectionString);
SqlConnection1.Open();
SqlCommand procCommand = new SqlCommand();
procCommand.CommandText = "DeleteCurrencyDriver";
procCommand.CommandType = CommandType.StoredProcedure;
procCommand.Connection = SqlConnection1;
// Fill parameters collection for the stored procedure.SqlParameter workParam = null;
workParam = procCommand.Parameters.Add("@CurrencyCode", SqlDbType.NChar, 1);
procCommand.Parameters["@CurrencyCode"].Value = "B";
try { procCommand.ExecuteNonQuery(); }
catch (SqlException e) { Console.WriteLine(e.Message); }
//Execute DeleteCurrency stored procedure directly
procCommand.CommandText = "DeleteCurrency";
try { procCommand.ExecuteNonQuery(); }
catch (SqlException e) { Console.WriteLine(e.Message); }
SqlConnection1.Close();
Console.WriteLine("Press any key to close...");
Console.Read();
}
}
}
Vea también
Tasks
Cómo: Habilitar la depuración de Transact-SQL para un proyecto de C++, Visual Basic o C#