Partilhar via


Como: Depurar um aplicativo de banco de dados Multi-tier

Este tópico se aplica a:

Edição

Visual Basic

C#

C++

Desenvolvedores Web

Express

Padrão

PRO e equipe

Legenda de tabela:

Aplica-se

Não é aplicada

Comando ou comandos oculta por padrão.

Este tópico contém código de exemplo que demonstra a depuração de um aplicativo de vários níveis e descreve as etapas necessárias para depurar a partir do código de aplicativo que residem em um cliente ou aplicativo intermediário no código para um objeto de banco de dados que seja executado dentro de SQL Server 2005.

Transições entre a camada de aplicativo e a camada do banco de dados requerem um ponto de interrupção na camada de destino; caso contrário, o código apenas será executado sem parar quando tenta passar para a camada.Mas as transições entre T-SQL e SQL CLR código dentro a camada do banco de dados não exigem os pontos de interrupção para habilitar a depuração entre eles.

O exemplo a seguir usa o banco de dados AdventureWorks e as etapas e para trás entre diferentes níveis e linguagens.A intenção do exemplo é ilustrar dessas transições e não é claramente um cenário real para os negócios.

Três procedimentos armazenados são chamados:

  • DeleteCurrency é um SQL procedimento armazenado CLR que exclui uma moeda com um código de moeda específica.

  • DeleteCurrency_T_SQL faz a mesma coisa, mas é escrito em T-SQL.

  • DeleteCurrencyDriver chamadas anteriores dois procedimentos com um parâmetro de entrada que especifica o código de moeda para excluir armazenados.

O código do aplicativo chama todos os procedimentos armazenados três, passando um parâmetro de código de moeda.Os dois procedimentos armazenados de "não-driver" forem chamados de dois diferentes contextos deDeleteCurrencyDrivere diretamente do aplicativo. No contexto primeiro, você poderá passar de DeleteCurrencyDriver na Outros dois procedimentos armazenados de. Quando eles são chamados do aplicativo, você não poderá entrar em-los e terá que conjunto pontos de interrupção dentro de procedimentos armazenados.

Depurar um aplicativo de banco de dados

  1. In um novo projeto SQL servidor, estabelecer uma conexão com o banco de dados AdventureWorks.Para obter mais informações, consulte Como: Conectar-se a um banco de dados.

  2. Crie um procedimento T-SQL armazenado usando o código da primeira seção do exemplo abaixo e denomine-DeleteCurrency_T_SQL. Para obter mais informações sobre esse assunto, ou qualquer uma das etapas neste procedimento, consulte Como: Desenvolver com o SQL servidor tipo de projeto.

  3. Criar um SQL procedimento armazenado CLR usando o código do exemplo segundo seção abaixo e o nome DeleteCurrency.cs.

  4. Criar um SQL procedimento armazenado CLR usando o código do exemplo terceiro seção abaixo e o nome DeleteCurrencyDriver.

  5. Sobre o Depurar menu, clicar Iniciar para compilar e implantar essas altera para o banco de dados AdventureWorks.

  6. Defina pelo menos um ponto de interrupção em cada procedimento armazenado.Depuração do código nativo ou gerenciado em um procedimento armazenado não funcionará.

  7. Criar um novo projeto de console em Visual Studio.

  8. Cole o código do quarto exemplo no editor de texto.

  9. Coloque pontos de interrupção antes e após cada telefonar para um procedimento armazenado.

  10. Execute o aplicativo pressionando F5.

  11. Percorrer diferentes módulos.

  12. Tente remover alguns dos pontos de interrupção para ver o efeito de tentar passar entre diferentes níveis e as linguagens.

  13. To finish debugging, clear all breakpoints from the Visual Studio Debug menu, and press F5.

Exemplo

Esta seção contém o código para o T-SQL procedimento armazenado.

CREATE PROCEDURE dbo.DeleteCurrency_T_SQL
    (
        @CurrencyCode nvarchar(3)
    )
AS
    SET NOCOUNT ON
    DELETE Sales.Currency 
    WHERE CurrencyCode = @currencyCode 
    RETURN

Esse código contém o código SQL CLR armazenados procedimento chamado a partir de um procedimento armazenado do driver.

using System;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
 
public partial class StoredProcedures
{
    [SqlProcedure]
    public static void DeleteCurrency(SqlString currencyCode)
    {
        string sCmd = "DELETE Sales.Currency WHERE CurrencyCode = '" + currencyCode.Value + "'";
        SqlConnection conn = new SqlConnection("Context Connection=True");
        conn.Open();
        SqlCommand  DeleteCurrencyCommand = new  SqlCommand( sCmd , conn);
        DeleteCurrencyCommand.ExecuteNonQuery();
    }
}

Esse código contém o código para o procedimento de driver SQL CLR que chama outros procedimentos.Esse procedimento armazenado é chamado da camada de aplicativo.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
 
public partial class StoredProcedures
{
    [SqlProcedure]
    public static void DeleteCurrencyDriver(SqlString CurrencyCode)
    {
        string sCommand = "DELETE Sales.Currency WHERE CurrencyCode = '" + CurrencyCode.Value + "'";
        SqlConnection conn = new SqlConnection("Context Connection=True");
        conn.Open();
        SqlCommand DeleteCurrencyCommand = new SqlCommand(sCommand, conn);
        DeleteCurrencyCommand.ExecuteNonQuery();
 
        // Now execute a T-SQL stored procedure.
        DeleteCurrencyCommand.CommandType = CommandType.StoredProcedure;
        DeleteCurrencyCommand.CommandText = "DeleteCurrency_T_SQL";
        // Fill the parameters collection based upon stored procedure.
        SqlParameter workParam = null;
        workParam = DeleteCurrencyCommand.Parameters.Add("@CurrencyCode", SqlDbType.NChar, 3);
        DeleteCurrencyCommand.Parameters["@CurrencyCode"].Value = "ESC";
        try { DeleteCurrencyCommand.ExecuteNonQuery(); }
        catch { }
 
        // Now execute a CLR stored procedure.
        DeleteCurrencyCommand.CommandText = "DeleteCurrency";
        try { DeleteCurrencyCommand.ExecuteNonQuery(); }
        catch { }
    }
};

Esse código contém o código do aplicativo que chamará o procedimento de driver armazenado, bem sistema autônomo diretamente chamando o T-SQL e procedimentos armazenados do SQL CLR.

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, 3);
            procCommand.Parameters["@CurrencyCode"].Value = "ESC";
            
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { DumpException(e); }
 
            procCommand.CommandText = "DeleteCurrency";
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { DumpException(e); }
 
            procCommand.CommandText = "DeleteCurrency_T_SQL";
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { DumpException(e); }
 
            SqlConnection1.Close();
        }
        static void DumpException(SqlException e)
       {
            string errorMessages = "";
            for (int i = 0; i < e.Errors.Count; i++)
           {
                errorMessages += "Index #" + i + "\n" +
                       "Message: " + e.Errors[i].Message + "\n" +
                       "LineNumber: " + e.Errors[i].LineNumber + "\n" +
                       "Source: " + e.Errors[i].Source + "\n" +
                       "Procedure: " + e.Errors[i].Procedure + "\n";
            }
            System.Diagnostics.EventLog log = new System.Diagnostics.EventLog();
            log.Source = "My Application";
            log.WriteEntry(errorMessages);
            Console.WriteLine("An exception occurred. Please contact your system administrator.");
        }
    }
}

Consulte também

Tarefas

Como: Habilitar depuração de SQL para um projeto

Como: Habilitar Depuração Multi-tier

Como: Habilitar depuração do CLR para uma conexão

Como: Habilitar depuração do SQL servidor 2005