Desenvolvimento - Visual Basic .NET

SQL Server + SqlClient = Receita perfeita

Este artigo não chega a melhorar o mundo, mas pelo menos tenta melhorar a perfomance de aplicações que utilizam o SQL Server como Banco de Dados.

por Cristian Arrano Townsend



Este artigo não chega a melhorar o mundo, mas pelo menos tenta melhorar a perfomance de aplicações que utilizam o SQL Server como Banco de Dados.

Como provar isso? Oras bolas, utilizando em uma mesma aplicação, em um mesmo Web Form as três conexões possíveis; SqlClient, Oledb e ODBC.

Para a bateria de testes, utilizei uma tabela com 20.000 registros. Para a criação da tabela, criei um script que fizesse todo o trabalho de população. Abaixo está a fiel copia do script.

declare @intNum int
declare @descCampo char(20)
set @intNum = 1
while @intNum <= 20000
	begin
	set @descCampo = "Descricao " + convert(char(100),@intNum)
	insert into TblMass (descTabela) values (@descCampo)
	set @intNum = @intNum + 1
end

A estrutura da tabela TblMass é a seguinte:

IdTabela - INT Identity (PK)
DescTabela - CHAR(20) NOT NULL

Web Form

Crie um Web Form chamado LoadMassData.aspx em uma determinada Aplicação Web no Visual Studio.NET.

Crie os seguintes controles no Web Form:

O Web Form terá a seguinte aparência:

O código

Vamos ao que interessa. Quando a página for carregada pela primeira vez (Page_Load / Not Page.IsPostBack), carregamos o DropDownList dos ManagedProviders, como mostra o código abaixo (Page_Load e BindDataManagedProviders)

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not Page.IsPostBack Then
            BindDataManagedProviders()
        End If
End Sub

Sub BindDataManagedProviders()
     Dim HshTblMp As New Hashtable
     HshTblMp.Add("1", "OleDb")
     HshTblMp.Add("2", "SqlClient")
     HshTblMp.Add("3", "ODBC")
     Me.DdlistManagedProvider.DataSource = HshTblMp
     Me.DdlistManagedProvider.DataTextField = "Value"
     Me.DdlistManagedProvider.DataValueField = "Key"
     Me.DdlistManagedProvider.DataBind()
End Sub

Uma vez carregada a página, é necessário carregar os dados no DataGrid segundo o Managed Provider escolhido. Para isso, vamos programar o Postback do Page_Load. Por que no Page_Load e não no evento do Botao BtnOk? Simplesmente porque o cálculo do tempo destinado para cada Managed Provider será realizado subtraindo o tempo final pelo tempo inicial. O cálculo é simples. Basta capturar o tempo (segundo e milisegundo) inicial e o tempo (segundo e milisegundos) final. Abaixo é mostrado o codigo do Page_Load final:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     If Not Page.IsPostBack Then
         BindDataManagedProviders()
     Else
         Dim SegundoInicio As Integer = Now.Second
         Dim MiliSegundosInicio As Integer = Now.Millisecond
         BindDataGrid()
         Dim SegundoFim As Integer = Now.Second
         Dim MiliSegundosFim As Integer = Now.Millisecond
         Me.LblCalculo.Text = CalculaTempo(SegundoInicio, MiliSegundosInicio, SegundoFim, 
MiliSegundosFim)
     End If
End Sub

Note que no meio da captura dos tempos esté o método BindDataGrid. Agora vamos ver o código de tal método;

Sub BindDataGrid()
     Dim strSql As String = "SpRetornaTabelaExemploMassa"
     Select Case Me.DdlistManagedProvider.SelectedItem.Value
         Case 1
             Dim ObjConnOleDb As New 
System.Data.OleDb.OleDbConnection("server=localhost;database=intranet;uid=cristian;pwd=cristian;
Provider=SQLOLEDB")
             Dim ObjCommandOleDb As New System.Data.OleDb.OleDbCommand(strSql, ObjConnOleDb)
             ObjCommandOleDb.CommandType = CommandType.StoredProcedure
             ObjConnOleDb.Open()
             Dim DrOleDb As System.Data.OleDb.OleDbDataReader = 
ObjCommandOleDb.ExecuteReader(CommandBehavior.CloseConnection)
             Me.DGridExemplo.DataSource = DrOleDb
             Me.DGridExemplo.DataBind()
         Case 2
             Dim ObjConnSql As New 
System.Data.sqlclient.SqlConnection("server=localhost;database=intranet;uid=cristian;pwd=cristian")
             Dim ObjCommandSql As New System.Data.SqlClient.SqlCommand(strSql, ObjConnSql)
             ObjCommandSql.CommandType = CommandType.StoredProcedure
             ObjConnSql.Open()
             Dim DrSql As System.Data.SqlClient.SqlDataReader = 
ObjCommandSql.ExecuteReader(CommandBehavior.CloseConnection)
             Me.DGridExemplo.DataSource = DrSql
             Me.DGridExemplo.DataBind()
         Case 3
             Dim ObjConnOdbc As New Microsoft.Data.Odbc.OdbcConnection("Driver={SQL 
Server};Server=cristian;UID=cristian;PWD=cristian;Database=Intranet")
             Dim ObjCommandOdbc As New Microsoft.Data.Odbc.OdbcCommand(strSql, ObjConnOdbc)
             ObjCommandOdbc.CommandType = CommandType.StoredProcedure
             ObjConnOdbc.Open()
             Dim DrOdbc As Microsoft.Data.Odbc.OdbcDataReader = 
ObjCommandOdbc.ExecuteReader(CommandBehavior.CloseConnection)
             Me.DGridExemplo.DataSource = DrOdbc
             Me.DGridExemplo.DataBind()
     End Select
End Sub

Agora é mostrado o código da função CalculaTempo:

Function CalculaTempo(ByVal SegundoInicio, ByVal MiliSegundoInicio, ByVal SegundoFim, ByVal 
MiliSegundoFim) As String
     Dim iValorFinal As Integer
     Dim difSegs As Integer = SegundoFim - SegundoInicio
     Select Case difSegs
         Case 0
             iValorFinal = MiliSegundoFim - MiliSegundoInicio
         Case 1
             iValorFinal = 1000 - MiliSegundoInicio
             iValorFinal += MiliSegundoFim
         Case Else
             iValorFinal = 1000 - MiliSegundoInicio
             iValorFinal += MiliSegundoFim
             iValorFinal += 1000
     End Select
     Return CType(iValorFinal, String)
End Function

Ok, temos o código e agora só nos resta testar. Logicamente vai variar muito dependendo do processador da maquina. Mas provavelmente a média dos tempos não irá variar.

Copiei os meus resultados para uma planilha Excel e tirei uma média de todos os Managed Providers, como mostra a figura abaixo:

Resumo

Tente sempre utilizar o Managed Provider do SQL para aplicações que utilizam Sql Server como Banco de Dados. Até a próxima.

Cristian Arrano Townsend

Cristian Arrano Townsend - Trabalha há 12 anos com desenvolvimento de software. Atualmente trabalha como consultor da FCAMARA em Curitiba, trabalhando com .NET, Metodologias Ágeis e Sharepoint. Possui algumas certificações Microsoft .NET e é Certified Scrum Master