Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
por Scott Mitchell
As edições do Visual Studio Professional e do Team System permitem definir pontos de interrupção e intervir 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 do banco de dados e a depuração de procedimentos armazenados nos aplicativos.
Introdução
O Visual Studio fornece uma experiência avançada de depuração. Com alguns pressionamentos de tecla ou cliques do mouse, é possível usar pontos de interrupção para interromper 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 de uma classe code-behind ASP.NET ou de uma classe da Camada de Lógica de Negócio, eles também podem ser colocados dentro de procedimentos armazenados.
Neste tutorial, examinaremos como intervir 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 do aplicativo ASP.NET em execução.
Observação
Infelizmente, os procedimentos armazenados só podem ser inseridos e depurados nas 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, será bem-vindo a ler enquanto percorremos as etapas necessárias para depurar procedimentos armazenados, mas não será possível replicar essas etapas em seu computador.
Os conceitos de depuração do SQL Server
O Microsoft SQL Server 2005 foi projetado para fornecer integração com o CLR (Common Language Runtime), que é o runtime usado por todos os assemblies .NET. Consequentemente, o SQL Server 2005 dá suporte a objetos de banco de dados gerenciados. Ou seja, você pode criar objetos de banco de dados como procedimentos armazenados e UDFs (funções User-Defined) 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, o SQL Server 2005 também oferece suporte para objetos de banco de dados T-SQL.
O SQL Server 2005 oferece suporte de depuração para objetos de banco de dados gerenciados e T-SQL. No entanto, esses objetos só podem ser depurados através das edições do Visual Studio 2005 Professional e Team System. Neste tutorial, examinaremos a depuração de objetos de banco de dados T-SQL. O próximo tutorial aborda a depuração de objetos de banco de dados gerenciados.
A entrada de blog Visão geral da depuração de T-SQL e CLR no SQL Server 2005 da equipe de integração CLR do SQL Server 2005 ressalta três maneiras de depurar objetos do SQL Server 2005 a partir do Visual Studio.
- Depuração direta de banco de dados (DDD) – no Gerenciador de Servidores, podemos entrar em qualquer objeto de banco de dados T-SQL, como procedimentos armazenados e UDFs. Examinaremos o DDD no Passo 1.
- Depuração de aplicativos – podemos definir pontos de interrupção em 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 do aplicativo, 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 nesses procedimentos armazenados ou UDFs em que queremos que o depurador pare. A partir da Etapa 2, é examinada a depuração do aplicativo.
- Depuração de um Projeto SQL Server – as edições do Visual Studio Professional e Visual Studio Team Systems incluem um tipo de projeto SQL Server que é normalmente 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 é uma que está instalada no mesmo computador que o Visual Studio. Se o banco de dados do SQL Server que você está usando não estiver localizado no computador 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. Se você estiver usando uma instância remota do SQL Server, no entanto, primeiro precisará garantir que, durante a depuração, esteja logado no computador de desenvolvimento com uma conta de usuário do Windows que tenha um logon do SQL Server na instância remota. Além disso, esse logon de banco de dados e o logon do banco de dados usado para se conectar ao banco de dados do aplicativo ASP.NET em execução devem ser membros da sysadmin função. Consulte a seção Depuração de 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.
Por fim, entenda que o suporte de depuração para objetos de banco de dados T-SQL não é tão avançado quanto o suporte de depuração para aplicativos .NET. Por exemplo, não há suporte para condições de ponto de interrupção e filtros, apenas um subconjunto das janelas de depuração está disponível, você não pode usar Editar e Continuar, a janela Imediata é tornada inútil e assim por diante. Consulte limitações em comandos e recursos do depurador para obter mais informações.
Passo 1: Entrando diretamente em um procedimento armazenado
O Visual Studio facilita a depuração direta de um objeto de banco de dados. Vamos examinar como usar o recurso DDD (Depuração de Banco de Dados Direto) para entrar no Products_SelectByCategoryID procedimento armazenado no banco de dados Northwind. Como o nome indica, Products_SelectByCategoryID retorna informações sobre produtos para uma categoria específica; foi criada no tutorial Usando procedimentos armazenados existentes para os TableAdapters do Conjunto de Dados Tipado. Comece acessando o Gerenciador de Servidores e expanda o nó de banco de dados Northwind. Em seguida, navegue até a pasta de Procedimentos Armazenados, clique com o botão direito do mouse no procedimento armazenado Products_SelectByCategoryID e escolha a opção Executar no Procedimento Armazenado no menu de contexto. Isso iniciará o depurador.
Como o Products_SelectByCategoryID procedimento armazenado espera um @CategoryID parâmetro de entrada, é solicitado que forneçamos esse valor. Insira 1, que retornará informações sobre as bebidas.
@CategoryID " />
Figura 1: Usar o valor 1 para o @CategoryID parâmetro
Depois de fornecer o valor para o @CategoryID parâmetro, o procedimento armazenado é executado. No entanto, em vez de executar até a conclusão, o depurador interrompe a execução na primeira instrução. Observe a seta amarela na margem, que indica a localização atual na procedure armazenada. Você pode visualizar e editar valores de parâmetro por meio da janela de Monitoramento ou posicionando o mouse sobre o nome do parâmetro no procedimento armazenado.
Figura 2: O Depurador foi interrompido na primeira instrução do procedimento armazenado (Clique para visualizar a imagem em tamanho completo)
Para percorrer o procedimento armazenado uma instrução de cada vez, clique no botão Passar por Cima na Barra de Ferramentas ou pressione a tecla F10. O Products_SelectByCategoryID procedimento armazenado contém uma única SELECT instrução, portanto, pressionar F10 passará por cima da instrução única e concluirá a execução do procedimento armazenado. Depois que o procedimento armazenado for concluído, sua saída será exibida na janela de saída e o depurador será finalizado.
Observação
A depuração 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 do aplicativo ASP.NET. Quando um procedimento armazenado com pontos de interrupção é invocado do aplicativo, a execução é interrompida no ponto de interrupção e podemos exibir e alterar os valores de parâmetro do procedimento armazenado e percorrer suas instruções, assim como fizemos na Etapa 1.
Antes de iniciarmos a depuração de procedimentos armazenados chamados do aplicativo, precisamos instruir o aplicativo Web ASP.NET a integrar-se 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 do SQL Server na seção Depuradores (consulte a Figura 3).
Figura 3: Verificar 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 de 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 está habilitado por padrão. No entanto, ao depurar, queremos desativar o pool de conexões porque a infraestrutura de depuração não é restabelecida corretamente ao trabalhar com uma conexão que foi retirada do pool.
Para desabilitar o pool de conexões, atualize o NORTHWNDConnectionString em Web.config para que 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 invocado por meio do aplicativo Web. Tudo o que resta agora é adicionar um ponto de interrupção a um procedimento armazenado e iniciar a depuração!
Etapa 3: Adicionar ponto de interrupção e depurar
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 atingindo 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 Products_SelectByCategoryID procedimento armazenado (clique para exibir a 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 no nó NORTHWND.MDF no Server Explorer. O menu de contexto deve incluir um item de menu marcado chamado Depuração de Aplicativo.
Figura 5: Verifique se a opção de depuração de aplicativo está habilitada
Com o ponto de interrupção definido e a opção de Depuração de Aplicações habilitada, estamos prontos para depurar o procedimento armazenado quando ele for chamado pelo aplicativo ASP.NET. Inicie o depurador acessando o menu Depurar e escolhendo Iniciar Depuração, clicando em F5 ou clicando no ícone de reprodução verde na Barra de Ferramentas. Isso iniciará o depurador e abrirá o site.
O Products_SelectByCategoryID procedimento armazenado foi criado no tutorial Usando procedimentos armazenados existentes para TableAdapters do Conjunto de Dados Tipado. 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 por meio do navegador. Ao acessar a página, o ponto de interrupção no Products_SelectByCategoryID procedimento armazenado será atingido e o controle será retornado ao Visual Studio. Assim como na Etapa 1, você pode percorrer as instruções do procedimento armazenado e exibir e modificar os valores de parâmetro.
Figura 6: A ExistingSprocs.aspx página exibe inicialmente as bebidas (clique para exibir a imagem em tamanho real)
Figura 7: O ponto de interrupção do procedimento armazenado foi atingido (clique para exibir a imagem em tamanho real)
Como mostra a janela Inspeção na Figura 7, o valor do parâmetro —@CategoryID— é 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 de lista suspensa selecionado CategoryID.
Figura 8: Escolher uma categoria diferente da lista de Drop-Down (clique para exibir a imagem em tamanho real)
@CategoryID reflete a categoria selecionada na 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 do 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 de Depuração de Aplicativo do banco de dados está habilitada. Se você ainda estiver tendo problemas, reinicie o Visual Studio e tente novamente.
Depurando objetos de banco 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 do banco de dados do SQL Server está no mesmo computador que o Visual Studio. No entanto, se o SQL Server e o Visual Studio residirem em computadores diferentes, será necessária uma configuração cuidadosa para que tudo funcione corretamente. Há duas tarefas principais que estamos enfrentando.
- Verifique se o logon usado para se conectar ao banco de dados por meio de ADO.NET pertence à
sysadminfunção. - Verifique se a conta de usuário do Windows usada pelo Visual Studio no computador de desenvolvimento é uma conta de logon válida do SQL Server que pertence à
sysadminfunção.
A primeira etapa é relativamente simples. Primeiro, identifique a conta de usuário usada para se conectar ao banco de dados 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, as chances são de que a conta do Windows com a qual você fez logon na estação de trabalho não seja um logon válido 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 da conta de logon do Windows.
Um exemplo deve ajudar a esclarecer as coisas. Imagine que há 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 membro da sysadmin função. Em seguida, para depurar a instância remota do SQL Server a partir do Visual Studio, nós precisaríamos executar o Visual Studio como usuário SQLDebug. Isso poderia ser feito desconectando de nossa estação de trabalho, logando novamente como SQLDebug, e então iniciando o Visual Studio, mas uma abordagem mais simples seria logar em nossa estação de trabalho usando nossas próprias credenciais e, em seguida, usar runas.exe para iniciar o Visual Studio como o usuário SQLDebug.
runas.exe permite que um aplicativo específico seja executado sob o pretexto de uma conta de usuário 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 o Guia do Hitchhiker de William R. Vaughnpara Visual Studio e SQL Server, Seventh Edition.
Observação
Se o computador 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 How To: Enable SQL Server 2005 Debugging observa que isso envolve duas etapas: (a) No computador host do Visual Studio, você deve adicionar Devenv.exe à lista exceções e abrir a porta TCP 135; e (b) No computador remoto (SQL), você deve abrir a porta TCP 135 e adicionar sqlservr.exe à lista de exceções. Se a política de domínio exigir que a comunicação de rede seja feita por meio do IPSec, você deverá 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, analisamos 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 por meio do Gerenciador de Servidores e clique com o botão direito do mouse nele e escolha Intervir. Isso inicia o depurador e interrompe a 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 essa abordagem para acessar o Products_SelectByCategoryID procedimento armazenado.
A depuração de aplicativos permite que os pontos de interrupção sejam definidos diretamente dentro dos objetos de banco de dados. Quando um objeto de banco de dados com pontos de interrupção é invocado por um aplicativo cliente (como um aplicativo Web ASP.NET), o programa é interrompido enquanto o depurador toma o controle. A depuração de aplicativos é útil porque mostra mais claramente qual ação do aplicativo faz com que um objeto de banco de dados específico seja invocado. No entanto, isso requer um pouco mais de configuração e preparação do que a Depuração Direta de Banco de Dados.
Objetos de banco de dados também podem ser depurados por meio de projetos do SQL Server. Examinaremos como usar projetos do SQL Server e como usá-los para criar e depurar objetos de banco de dados gerenciados no próximo tutorial.
Divirta-se programando!
Sobre o autor
Scott Mitchell, autor de sete livros asp/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Microsoft Web desde 1998. Scott trabalha como consultor independente, treinador e escritor. Seu último livro é Sams Teach Yourself ASP.NET 2.0 em 24 Horas. Ele pode ser alcançado em mitchell@4GuysFromRolla.com.