VB 2005 - Obtendo Estatísticas de SQL Server


O novo método RetrieveStatistics da classe SqlConnection da ADO.NET 2.0 efetua uma consulta na instância do SQL Server de destino para a conexão atual e retorna um objeto IDictionary que contém informações estatísticas sobre o SQL Server.

Para poder usar este recurso você deve habilitá-lo de forma explícita pelo execução da instrução :

SqlConnection.StatisticsEnabled = True

antes de invocar o método RetrieveStatistics . Como o retorno é feito na forma de pares de valores no objeto IDictionary uma das formas de tratar a informação recebida é efetuar uma conversão forçada (cast) do objeto IDictionary para o tipo HashTable e em seguida efetuar a iteração sobre a HashTable usando o Laço For Each...Next.

Inicie um novo projeto no Visual Basic 2005 com o nome de sqlEstatisticasNet.

Inclua a seguinte declaração no início do seu projeto:  Imports System.data.sqlclient

Altere o nome do formulário padrão de form1.vb para frmPrincipal.vb e início do formulário padrão declare as seguintes variáveis:

Private htEstado As Hashtable

nota: A linha de código abaixo define a conexão com o banco de dados Cadastro.mdf em minha máquina para o seu ambiente ela será diferente e você pode usar qualquer banco de dados do SQL Server 2005.

Private strConn As String = "Data Source=.\SQLEXPRESS;AttachDbFilename='D:\Documents and Settings\Macoratti.MACORATI\Meus documentos\Cadastro.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True"

No formulário principal inclua um botão de comando - btnExibirEstatisticas - , sendo que no evento Click deste botão inclua o código abaixo:

Private Sub btnExibirEstatisticas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibirEstatisticas.Click
       'define a conexão 
        Dim cnnCadastro As SqlConnection = New SqlConnection(strConn)
       'habilita a exibição das estatísticas
        cnnCadastro.StatisticsEnabled = True
        Dim sql As String = "SELECT * FROM Clientes"
        'efetua uma operação com a conexão preenchendo um dataset
        Try
            Dim adapter As SqlDataAdapter = New SqlDataAdapter(Sql, strConn)
            Dim dataSet As DataSet = New DataSet
            adapter.Fill(dataSet, "Clientes")
        Catch
            MsgBox("Ocorreu um erro durante a conexão e preenchimento do dataset.", MsgBoxStyle.Critical, "Erro")
            Exit Sub
        End Try

        'Exibir estatisticas da conexão SQL Server
        Try
           'obtém os valores em uma HashTable
          htEstado = CType(cnnCadastro.RetrieveStatistics(), Hashtable)
 
            Dim txtEstatisticas As Control = frmEstatisticas.Controls.Item("txtEstatisticas")
            txtEstatisticas.Text = ""

            Dim oStat As Object
            Dim strStat As String
 
            'percorre a Hashtable para exibir os valores
            For Each oStat In htEstado.Keys
                strStat = oStat.ToString
                If InStr(strStat, "Time") > 0 Then
                    txtEstatisticas.Text += strStat + " = " + _
                      Microsoft.VisualBasic.Format(CLng(htEstado(strStat)) / 1000, "#,##0.000") + " secs" + vbCrLf
                Else
                    txtEstatisticas.Text += strStat + " = " + htEstado(strStat).ToString + vbCrLf
                End If
            Next
             'exibe o formulário das estatísticas
            frmEstatisticas.Show()
            frmEstatisticas.Controls.Item("btnFechar").Focus()
        Catch excStats As Exception
            MsgBox(excStats.Message + excStats.StackTrace, , "Ocorreu um erro durante a exibição das estatísticas...")
        Finally
            cnnCadastro.Close()
        End Try
    End Sub

Inclua a agora um novo formulário windows no seu projeto através do Menu Project|Add Windows Forms com o nome de frmEstatisticas.vb e inclua no formulário um botão de Comando - btnFechar e uma caixa de Texto - txtEstatisticas.text definindo as propriedades Multiline = True e ScrollBars = Vertical.

Ao executar o projeto o formulário principal irá surgir , clicando no botão de comando , as estatísticas serão exibidas no formulário conforme abaixo. No meu caso como a conexão foi feita com uma tabela local quase vazia os valores foram todos zeros.

Atualmente podemos obter até 18 estatísticas. Se você deseja obter alguma de forma individual pode usar escolher qual deseja obter. Abaixo um exemplo onde estamos obtendo os valores para algumas estatísticas:

IDictionary statistics = connection.RetrieveStatistics()

Long serverRoundtrips = Dim statistics("ServerRoundtrips") As (Long)
Long connectionTime = Dim statistics("ConnectionTime") As (Long)
Long bytesReceived = Dim statistics("BytesReceived") As (Long)
Long sumResultSets = Dim statistics("SumResultSets") As (Long)
Long selectRows = Dim statistics("SelectRows") As (Long

Se você não quiser usar uma HashTable pode percorrer o objeto IDictionary usando um laço. Abaixo um exemplo que imprime os valores no console:

For Each entry As DictionaryEntry In statistics
 Console.WriteLine("Key: {0}, Value: {1}", entry.Key.ToString, entry.Value.ToString)
Next

Lembre-se sempre que quando o método é chamado os valores retornados referem-se aqueles do momento da execução, se você continuar usando a conexão , os valores ficarão incorretos; você precisa re-executar o método para obter os valores atualizados.

Até o próximo artigo VB.NET 2005.


José Carlos Macoratti