Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
por Scott Mitchell
As edições do Visual Studio Professional e Team System permitem que você defina pontos de interrupção e entre em procedimentos armazenados no SQL Server, tornando a depuração de procedimentos armazenados tão fácil quanto depurar o código do aplicativo. Este tutorial demonstra a depuração direta de base de dados e a depuração de procedimentos armazenados em aplicações.
Introdução
O Visual Studio fornece uma experiência de depuração avançada. Com algumas teclas pressionadas ou cliques do mouse, é possível usar pontos de interrupção para parar a execução de um programa e examinar seu estado e fluxo de controle. Junto com a depuração do código do aplicativo, o Visual Studio oferece suporte para depuração de procedimentos armazenados de dentro do SQL Server. Assim como os pontos de interrupção podem ser definidos dentro do código de uma classe code-behind ASP.NET ou classe Business Logic Layer, eles também podem ser colocados dentro de procedimentos armazenados.
Neste tutorial, examinaremos a entrada em procedimentos armazenados do Gerenciador de Servidores no Visual Studio, bem como como definir pontos de interrupção que são atingidos quando o procedimento armazenado é chamado a partir do aplicativo ASP.NET em execução.
Observação
Infelizmente, os procedimentos armazenados só podem ser inseridos e depurados por meio das versões Professional e Team Systems do Visual Studio. Se você estiver usando o Visual Web Developer ou a versão padrão do Visual Studio, poderá ler enquanto percorremos as etapas necessárias para depurar procedimentos armazenados, mas não poderá replicar essas etapas em sua máquina.
Conceitos de depuração do SQL Server
O Microsoft SQL Server 2005 foi projetado para fornecer integração com o Common Language Runtime (CLR), que é o tempo de execução usado por todos os assemblies .NET. Consequentemente, o SQL Server 2005 oferece suporte a objetos de banco de dados gerenciados. Ou seja, você pode criar objetos de banco de dados como procedimentos armazenados e UDFs (User-Defined Functions) como métodos em uma classe C#. Isso permite que esses procedimentos armazenados e UDFs utilizem a funcionalidade no .NET Framework e de suas próprias classes personalizadas. É claro que o SQL Server 2005 também fornece suporte para objetos de banco de dados T-SQL.
O SQL Server 2005 oferece suporte à depuração para T-SQL e objetos de banco de dados gerenciados. No entanto, esses objetos só podem ser depurados através das edições do Visual Studio 2005 Professional e Team Systems. Neste tutorial, examinaremos a depuração de objetos de banco de dados T-SQL. O tutorial subsequente analisa a depuração de objetos de banco de dados gerenciados.
O post de blog Visão geral da depuração de T-SQL e CLR no SQL Server 2005 da equipa de integração CLR do SQL Server 2005 destaca os três métodos para depurar objetos do SQL Server 2005 a partir do Visual Studio:
- Depuração direta de banco de dados (DDD) - a partir do Gerenciador de Servidores, podemos entrar em qualquer objeto de banco de dados T-SQL, como procedimentos armazenados e UDFs. Examinaremos o DDD na Etapa 1.
- Depuração de aplicativos - podemos definir pontos de interrupção dentro de um objeto de banco de dados e, em seguida, executar nosso aplicativo ASP.NET. Quando o objeto de banco de dados é executado, o ponto de interrupção será atingido e o controle será entregue ao depurador. Observe que, com a depuração de aplicativos, não podemos entrar em um objeto de banco de dados a partir do código do aplicativo. Devemos definir explicitamente pontos de interrupção nos Procedimentos Armazenados ou Funções Definidas pelo Utilizador (UDFs) onde queremos que o depurador pare. A análise de depuração do aplicativo inicia-se na Etapa 2.
- A depuração de um projeto do SQL Server - as edições do Visual Studio Professional e Team Systems incluem um tipo de projeto do SQL Server que é comumente usado para criar objetos de banco de dados gerenciados. Examinaremos o uso de projetos do SQL Server e a depuração de seu conteúdo no próximo tutorial.
O Visual Studio pode depurar procedimentos armazenados em instâncias locais e remotas do SQL Server. Uma instância local do SQL Server é aquela instalada na mesma máquina que o Visual Studio. Se o banco de dados do SQL Server que você está usando não estiver localizado em sua máquina de desenvolvimento, ele será considerado uma instância remota. Para esses tutoriais, temos usado instâncias locais do SQL Server. A depuração de procedimentos armazenados em uma instância remota do SQL Server requer mais etapas de configuração do que ao depurar procedimentos armazenados em uma instância local.
Se você estiver usando uma instância local do SQL Server, poderá começar com a Etapa 1 e trabalhar neste tutorial até o final. No entanto, se você estiver usando uma instância remota do SQL Server, primeiro precisará garantir que, ao depurar, você esteja conectado à máquina de desenvolvimento com uma conta de usuário do Windows que tenha um logon do SQL Server na instância remota. Além disso, tanto este login de base de dados quanto o login de base de dados usado para conectar à base de dados desde a aplicação ASP.NET em execução devem ser membros da função sysadmin. Consulte a seção Depurando objetos de banco de dados T-SQL em instâncias remotas no final deste tutorial para obter mais informações sobre como configurar o Visual Studio e o SQL Server para depurar uma instância remota.
Finalmente, entenda que o suporte à depuração para objetos de banco de dados T-SQL não é tão rico em recursos quanto o suporte de depuração para aplicativos .NET. Por exemplo, condições de ponto de interrupção e filtros não são suportados, apenas um subconjunto das janelas de depuração está disponível, não se pode usar a funcionalidade Editar e Continuar, a janela Imediata torna-se inútil, e assim por diante. Consulte Limitações nos comandos e recursos do depurador para obter mais informações.
Etapa 1: Acesso direto a um procedimento armazenado
O Visual Studio facilita a depuração direta de um objeto de banco de dados. Vamos ver como usar o recurso DDD (Direct Database Debugging) para entrar no Products_SelectByCategoryID procedimento armazenado no banco de dados Northwind. Como o próprio nome indica, Products_SelectByCategoryID retorna informações do produto para uma categoria específica; foi criado no tutorial Usando procedimentos armazenados existentes para os TableAdapters do conjunto de dados tipificado. Comece por ir ao Explorador de Servidores e expanda o nó da base de dados Northwind. Em seguida, expanda a pasta Stored Procedures, clique com o botão direito no procedimento armazenado Products_SelectByCategoryID e escolha a opção Step Into Stored Procedure no menu de contexto. Isso iniciará o depurador.
Como o Products_SelectByCategoryID procedimento armazenado espera um @CategoryID parâmetro de entrada, somos solicitados a fornecer esse valor. Digite 1, que retornará informações sobre as bebidas.
@CategoryID " />
Figura 1: Use o valor 1 para o @CategoryID parâmetro
Depois de fornecer o valor para o @CategoryID parâmetro, o procedimento armazenado é executado. Em vez de correr até a conclusão, porém, o depurador interrompe a execução na primeira instrução. Observe a seta amarela na margem, indicando o local atual no procedimento armazenado. Você pode exibir e editar valores de parâmetros através da janela Watch ou passando o mouse sobre o nome do parâmetro no procedimento armazenado.
Figura 2: O depurador parou na primeira instrução do procedimento armazenado (Clique para visualizar a imagem em tamanho real)
Para percorrer o procedimento armazenado uma instrução de cada vez, clique no botão Step Over na barra de ferramentas ou pressione a tecla F10. O Products_SelectByCategoryID procedimento armazenado contém uma única SELECT instrução, portanto, pressionar F10 irá passar por cima da instrução única e concluir a execução do procedimento armazenado. Após a conclusão do procedimento armazenado, a sua saída aparecerá na janela de Saída e o depurador terminará.
Observação
A depuração do T-SQL ocorre no nível da instrução; você não pode entrar em uma SELECT declaração.
Etapa 2: Configurando o site para depuração de aplicativos
Embora a depuração de um procedimento armazenado diretamente do Gerenciador de Servidores seja útil, em muitos cenários estamos mais interessados em depurar o procedimento armazenado quando ele é chamado de nosso aplicativo ASP.NET. Podemos adicionar pontos de interrupção a um procedimento armazenado no Visual Studio e, em seguida, iniciar a depuração da aplicação ASP.NET. Quando um procedimento armazenado com pontos de interrupção é invocado a partir do aplicativo, a execução será interrompida no ponto de interrupção e podemos visualizar e alterar os valores dos parâmetros do procedimento armazenado e percorrer suas instruções, assim como fizemos na Etapa 1.
Antes de começarmos a depurar procedimentos armazenados chamados a partir do aplicativo, precisamos instruir o aplicativo Web ASP.NET a se integrar ao depurador do SQL Server. Comece clicando com o botão direito do mouse no nome do site no Gerenciador de Soluções (ASPNET_Data_Tutorial_74_CS). Escolha a opção "Páginas de Propriedades" no menu de contexto, selecione o item "Opções de Início" à esquerda e marque a caixa de seleção "SQL Server" na seção de Depuradores (consulte a Figura 3).
Figura 3: Marque a caixa de seleção do SQL Server nas páginas de propriedades do aplicativo (Clique para exibir a imagem em tamanho real)
Além disso, precisamos atualizar a cadeia de conexão do banco de dados usada pelo aplicativo para que o pool de conexões seja desabilitado. Quando uma conexão com um banco de dados é fechada, o objeto correspondente SqlConnection é colocado em um pool de conexões disponíveis. Ao estabelecer uma conexão com um banco de dados, um objeto de conexão disponível pode ser recuperado desse pool em vez de ter que criar e estabelecer uma nova conexão. Esse pool de objetos de conexão é um aprimoramento de desempenho e é habilitado por padrão. No entanto, ao depurar, pretendemos desativar o pool de conexões porque a infraestrutura de depuração não é corretamente restabelecida quando se trabalha com uma conexão retirada do pool.
Para desativar o pool de conexões, atualize o NORTHWNDConnectionString in Web.config para que ele inclua a configuração 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>
Observação
Depois de concluir a depuração do SQL Server por meio do aplicativo ASP.NET, certifique-se de restabelecer o pool de conexões removendo a Pooling configuração da cadeia de conexão (ou definindo-a como Pooling=true ).
Neste ponto, o aplicativo ASP.NET foi configurado para permitir que o Visual Studio depure objetos de banco de dados do SQL Server quando invocados por meio do aplicativo Web. Tudo o que resta agora é adicionar um ponto de interrupção num procedimento armazenado e iniciar a depuração!
Etapa 3: Adicionando um ponto de interrupção e depuração
Abra o Products_SelectByCategoryID procedimento armazenado e defina um ponto de interrupção no início da SELECT instrução clicando na margem no local apropriado ou colocando o cursor no início da SELECT instrução e pressionando F9. Como ilustra a Figura 4, o ponto de interrupção aparece como um círculo vermelho na margem.
Figura 4: Definir um ponto de interrupção no procedimento armazenado (Products_SelectByCategoryID imagem em tamanho real)
Para que um objeto de banco de dados SQL seja depurado por meio de um aplicativo cliente, é imperativo que o banco de dados seja configurado para dar suporte à depuração de aplicativos. Quando você define um ponto de interrupção pela primeira vez, essa configuração deve ser ativada automaticamente, mas é prudente verificar novamente. Clique com o botão direito do rato sobre o nó no Explorador de Servidores. O menu de contexto deve incluir um item de menu verificado chamado Depuração de Aplicativos .
Figura 5: Verifique se a opção de depuração do aplicativo está habilitada
Com o ponto de interrupção definido e a opção de depuração de aplicativo habilitada, estamos prontos para depurar o procedimento armazenado quando chamado a partir do aplicativo ASP.NET. Inicie o depurador indo para o Menu Depurar e escolhendo Iniciar Depuração, pressionando F5 ou clicando no ícone verde de executar na Barra de Ferramentas. Isso iniciará o depurador e iniciará o site.
O Products_SelectByCategoryID procedimento armazenado foi criado no tutorial Usando procedimentos armazenados existentes para o TableAdapters do conjunto de dados digitado . Sua página da Web correspondente (~/AdvancedDAL/ExistingSprocs.aspx) contém um GridView que exibe os resultados retornados por este procedimento armazenado. Visite esta página através do navegador. Ao chegar à página, o ponto de interrupção no Products_SelectByCategoryID procedimento armazenado será atingido e o controlo retornará ao Visual Studio. Assim como na Etapa 1, você pode percorrer as instruções do procedimento armazenado e exibir e modificar os valores dos parâmetros.
Figura 6: A ExistingSprocs.aspx página exibe inicialmente as bebidas (Clique para visualizar a imagem em tamanho real)
Figura 7: O ponto de interrupção do procedimento armazenado foi atingido (Clique para visualizar a imagem em tamanho real)
Como mostra a janela Watch na Figura 7, o valor do @CategoryID parâmetro é 1. Isso ocorre porque a ExistingSprocs.aspx página exibe inicialmente produtos na categoria de bebidas, que tem um CategoryID valor de 1. Escolha uma categoria diferente na lista suspensa. Isso causa um postback e executa novamente o Products_SelectByCategoryID procedimento armazenado. O ponto de interrupção é atingido novamente, mas desta vez o valor do parâmetro @CategoryID reflete o item selecionado da lista suspensa CategoryID.
Figura 8: Escolha uma categoria diferente na lista de Drop-Down (Clique para visualizar a imagem em tamanho real)
@CategoryID reflete a categoria selecionada da página da Web" />
Figura 9: O @CategoryID parâmetro reflete a categoria selecionada na página da Web (Clique para exibir a imagem em tamanho real)
Observação
Se o ponto de interrupção no Products_SelectByCategoryID procedimento armazenado não for atingido ao visitar a ExistingSprocs.aspx página, verifique se a caixa de seleção SQL Server foi marcada na seção Depuradores da Página de Propriedades do aplicativo ASP.NET, se o pool de conexões foi desabilitado e se a opção Depuração de Aplicativo do banco de dados está habilitada. Se você ainda estiver tendo problemas, reinicie o Visual Studio e tente novamente.
Depuração de objetos de base de dados T-SQL em instâncias remotas
A depuração de objetos de banco de dados por meio do Visual Studio é bastante simples quando a instância de banco de dados do SQL Server está na mesma máquina que o Visual Studio. No entanto, se o SQL Server e o Visual Studio residirem em máquinas diferentes, alguma configuração cuidadosa será necessária para que tudo funcione corretamente. Temos duas tarefas principais pela frente:
- Verifique se o login usado para se conectar ao banco de dados via ADO.NET pertence à
sysadminfunção. - Verifique se a conta de usuário do Windows usada pelo Visual Studio na máquina de desenvolvimento é uma conta de logon válida do SQL Server que pertence à
sysadminfunção.
O primeiro passo é relativamente simples. Primeiro, identifique a conta de usuário usada para se conectar ao banco de dados a partir do aplicativo ASP.NET e, em seguida, do SQL Server Management Studio, adicione essa conta de logon à sysadmin função.
A segunda tarefa requer que a conta de usuário do Windows usada para depurar o aplicativo seja um logon válido no banco de dados remoto. No entanto, talvez a conta do Windows com a qual iniciou sessão na sua estação de trabalho não seja uma sessão válida de login no SQL Server. Em vez de adicionar sua conta de logon específica ao SQL Server, uma opção melhor seria designar alguma conta de usuário do Windows como a conta de depuração do SQL Server. Em seguida, para depurar os objetos de banco de dados de uma instância remota do SQL Server, você executaria o Visual Studio usando as credenciais dessa conta de logon do Windows.
Um exemplo deve ajudar a esclarecer as coisas. Imagine que existe uma conta do Windows nomeada SQLDebug dentro do domínio do Windows. Essa conta precisaria ser adicionada à instância remota do SQL Server como um logon válido e como um membro da sysadmin função. Em seguida, para depurar do Visual Studio a instância remota do SQL Server, devemos executar o Visual Studio como o usuário SQLDebug. Isso poderia ser feito fazendo logout de nossa estação de trabalho, fazendo login novamente como SQLDebuge, em seguida, iniciando o Visual Studio, mas uma abordagem mais simples seria fazer logon em nossa estação de trabalho usando nossas próprias credenciais e, em seguida, usar runas.exe para iniciar o Visual Studio como o SQLDebug usuário.
runas.exe permite que uma determinada aplicação seja executada sob o disfarce de uma conta de utilizador diferente. Para iniciar o Visual Studio como SQLDebug, você pode inserir a seguinte instrução na linha de comando:
runas.exe /user:SQLDebug "%PROGRAMFILES%\Microsoft Visual Studio 8\Common7\IDE\devenv.exe"
Para obter uma explicação mais detalhada sobre esse processo, consulte William R. Vaughn'sHitchhiker s Guide to Visual Studio and SQL Server, Seventh Edition.
Observação
Se a sua máquina de desenvolvimento estiver executando o Windows XP Service Pack 2, você precisará configurar o Firewall de Conexão com a Internet para permitir a depuração remota.
O artigo Como habilitar a depuração do SQL Server 2005 observa que isso envolve duas etapas: (a) Na máquina host do Visual Studio, você deve adicionar Devenv.exe à lista de exceções e abrir a porta TCP 135 e (b) Na máquina remota (SQL), você deve abrir a porta TCP 135 e adicionar sqlservr.exe à lista de exceções. Se a sua política de domínio exigir que a comunicação de rede seja feita através de IPSec, tem de abrir as portas UDP 4500 e UDP 500.
Resumo
Além de fornecer suporte de depuração para código de aplicativo .NET, o Visual Studio também fornece uma variedade de opções de depuração para o SQL Server 2005. Neste tutorial, examinamos duas dessas opções: Depuração direta de banco de dados e depuração de aplicativos. Para depurar diretamente um objeto de banco de dados T-SQL, localize o objeto através do Gerenciador de Servidores, clique com o botão direito do mouse nele e escolha Step Into. Isso inicia o depurador e para na primeira instrução no objeto de banco de dados, momento em que você pode percorrer as instruções do objeto e exibir e modificar valores de parâmetro. Na Etapa 1, usamos esta abordagem para aceder ao Products_SelectByCategoryID procedimento armazenado.
A depuração de aplicativos permite que os pontos de interrupção sejam definidos diretamente nos objetos do banco de dados. Quando um objeto de base de dados com pontos de interrupção é invocado a partir de uma aplicação cliente (como uma aplicação web ASP.NET), o programa é interrompido enquanto o depurador assume o controle. A depuração de aplicativos é útil porque mostra mais claramente qual ação do aplicativo faz com que um determinado objeto de banco de dados seja invocado. No entanto, requer um pouco mais de configuração e preparação do que a depuração direta de bases de dados.
Os objetos de banco de dados também podem ser depurados por meio de projetos do SQL Server. Veremos como usar projetos do SQL Server e como usá-los para criar e depurar objetos de banco de dados gerenciados no próximo tutorial.
Feliz Programação!
Sobre o Autor
Scott Mitchell, autor de sete livros sobre ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias Web da Microsoft desde 1998. Scott trabalha como consultor, formador e escritor independente. Seu último livro é Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Ele pode ser contatado em mitchell@4GuysFromRolla.com.