Depuração de procedimentos armazenados (C#)
por Scott Mitchell
Visual Studio Professional e edições do Team System permitem definir pontos de interrupção e intervir em procedimentos armazenados em SQL Server, tornando a depuração de procedimentos armazenados tão fácil quanto a depuração do código do aplicativo. Este tutorial demonstra a depuração direta do banco de dados e a depuração de aplicativos de procedimentos armazenados.
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. Juntamente com a depuração do código do aplicativo, o Visual Studio oferece suporte para depuração de procedimentos armazenados de dentro de SQL Server. Assim como os pontos de interrupção podem ser definidos dentro do código de uma classe code-behind ASP.NET ou da classe Camada de Lógica Empresarial, eles também podem ser colocados em procedimentos armazenados.
Neste tutorial, examinaremos como intervir em procedimentos armazenados do servidor Explorer 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 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, será bem-vindo a ler enquanto percorremos as etapas necessárias para depurar procedimentos armazenados, mas você não poderá replicar essas etapas em seu computador.
conceitos de depuração 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 do .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 (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 em suas próprias classes personalizadas. É claro que SQL Server 2005 também oferece suporte para objetos de banco de dados T-SQL.
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 por meio 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.
A visão geral da depuração T-SQL e CLR na entrada de blog SQL Server 2005 da equipe de integração clr do SQL Server 2005 realça as três maneiras de depurar objetos SQL Server 2005 do Visual Studio:
- DDD (Depuração de Banco de Dados Direto) – do Servidor Explorer podemos intervir em qualquer objeto de banco de dados T-SQL, como procedimentos armazenados e UDFs. Examinaremos o DDD na Etapa 1.
- Depuração de aplicativo – 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 for 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 intervir em um objeto de banco de dados do código do aplicativo. Devemos definir explicitamente os pontos de interrupção nesses procedimentos armazenados ou UDFs em que queremos que o depurador pare. A depuração do aplicativo é examinada a partir da Etapa 2.
- A depuração de um projeto de SQL Server – edições Visual Studio Professional e Team Systems incluem um tipo de projeto SQL Server que normalmente é usado para criar objetos de banco de dados gerenciados. Examinaremos o uso SQL Server Projetos e a depuração de seu conteúdo no próximo tutorial.
O Visual Studio pode depurar procedimentos armazenados em instâncias de SQL Server locais e remotas. Uma instância de SQL Server local é aquela instalada no mesmo computador que o Visual Studio. Se o banco de dados SQL Server que você está usando não estiver localizado em seu computador de desenvolvimento, ele será considerado uma instância remota. Para esses tutoriais, temos usado instâncias de SQL Server locais. A depuração de procedimentos armazenados em uma instância remota do SQL Server requer mais etapas de configuração do que a depuração de procedimentos armazenados em uma instância local.
Se você estiver usando uma instância de SQL Server local, poderá começar com a Etapa 1 e trabalhar neste tutorial até o final. No entanto, se você estiver usando uma instância de SQL Server remota, primeiro precisará garantir que, ao depurar, você esteja conectado ao computador de desenvolvimento com uma conta de usuário do Windows que tenha um logon 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 Depurando objetos T-Banco de Dados SQL em instâncias remotas no final deste tutorial para obter mais informações sobre como configurar o Visual Studio e 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 e filtros de ponto de interrupção, 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.
Etapa 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 do produto para uma categoria específica; elas foram criadas no tutorial Usando procedimentos armazenados existentes para o tableAdapters do Conjunto de Dados Tipado . Comece acessando a Explorer de servidor e expanda o nó de banco de dados Northwind. Em seguida, faça uma busca detalhada na pasta Procedimentos Armazenados, clique com o botão direito do Products_SelectByCategoryID
mouse no procedimento armazenado e escolha a opção Intervir 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, indicando o local atual no procedimento armazenado. Você pode exibir e editar valores de parâmetro por meio da janela Inspeção ou passando 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 exibir a imagem em tamanho real)
Para percorrer o procedimento armazenado uma instrução por 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, clicar em F10 percorrerá a única instrução e concluirá a execução do procedimento armazenado. Depois que o procedimento armazenado for concluído, sua saída será exibida na janela Saída e o depurador será encerrado.
Observação
A depuração do T-SQL ocorre no nível da instrução; você não pode entrar em uma SELECT
instrução.
Etapa 2: Configurando o site para depuração de aplicativos
Embora a depuração de um procedimento armazenado diretamente do servidor Explorer 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, começar a depurar o 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 se integrar ao depurador de 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 marcar a caixa de seleção SQL Server na seção Depuradores (consulte a Figura 3).
Figura 3: Marque a caixa de seleção SQL Server nas Páginas de Propriedades do Aplicativo (Clique para exibir a imagem em tamanho real)
Além disso, precisamos atualizar o banco de dados cadeia de conexão usado 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 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 SQL Server por meio do aplicativo ASP.NET, certifique-se de restabelecer o pool de conexões removendo a Pooling
configuração do cadeia de conexão (ou definindo-o como Pooling=true
).
Neste ponto, o aplicativo ASP.NET foi configurado para permitir que o Visual Studio depure SQL Server objetos de banco de dados 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 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 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 marcar duas vezes. Clique com o botão direito do NORTHWND.MDF
mouse no nó no servidor 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 Depuração de Aplicativo habilitada, estamos prontos para depurar o procedimento armazenado quando chamado do aplicativo ASP.NET. Inicie o depurador acessando o menu Depurar e escolhendo Iniciar Depuração, pressionando F5 ou clicando no ícone de reprodução verde 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 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 chegar à página, o ponto de interrupção no procedimento armazenado será atingido e o Products_SelectByCategoryID
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 @CategoryID
valor do parâmetro é 1. Isso ocorre porque a ExistingSprocs.aspx
página exibe inicialmente produtos na categoria 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 @CategoryID
valor do parâmetro reflete o item de lista suspensa selecionado s CategoryID
.
Figura 8: Escolher uma Categoria Diferente na 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 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.
Depurando objetos T-Banco de Dados 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 SQL Server está no mesmo computador que o Visual Studio. No entanto, se 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 à
sysadmin
função . - Verifique se a conta de usuário do Windows usada pelo Visual Studio no computador de desenvolvimento é válida SQL Server conta de logon que pertence à
sysadmin
funçã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 SQL Server Management Studio, adicione essa conta de logon à sysadmin
função.
A segunda tarefa exige 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 em sua estação de trabalho não seja um logon válido no SQL Server. Em vez de adicionar sua conta de logon específica a SQL Server, uma opção melhor seria designar alguma conta de usuário do Windows como a conta de depuração SQL Server. Em seguida, para depurar os objetos de banco de dados de uma instância de SQL Server remota, você executaria o Visual Studio usando as credenciais dessa conta de logon do Windows.
Um exemplo deve ajudar a esclarecer as coisas. Imagine que há uma conta do Windows chamada SQLDebug
dentro do domínio do Windows. Essa conta precisaria ser adicionada à instância de SQL Server remota como um logon válido e como membro da sysadmin
função. Em seguida, para depurar a instância de SQL Server remota do Visual Studio, precisamos executar o Visual Studio como o SQLDebug
usuário. Isso pode ser feito fazendo logoff de nossa estação de trabalho, fazendo logon novamente como SQLDebug
e, 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 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 Caroneiro de William R. Vaughnpara o Visual Studio e SQL Server, Sétima Edição.
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 Exceções. Se sua 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 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 por meio do servidor Explorer 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 intervir no Products_SelectByCategoryID
procedimento armazenado.
A depuração de aplicativos permite que os pontos de interrupção sejam definidos diretamente nos objetos de banco de dados. Quando um objeto de banco de dados com pontos de interrupção é invocado de um aplicativo cliente (como um aplicativo Web ASP.NET), o programa é interrompido à medida que o depurador assume. 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, ele requer um pouco mais de configuração e configuraçã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 SQL Server. Examinaremos o uso de projetos SQL Server e como usá-los para criar e depurar objetos de banco de dados gerenciados no próximo tutorial.
Programação feliz!
Sobre o autor
Scott Mitchell, autor de sete livros do 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 contatado em mitchell@4GuysFromRolla.com. ou através de seu blog, que pode ser encontrado em http://ScottOnWriting.NET.