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 TownsendComo 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:
Controle | ID | Text |
Label | LblTitulo | Escolha o Managed Provider |
Label | LblCalculo | |
DropDownList | DdlistManagedProvider | |
Button | Btn | Ok |
DataGrid | DGridExemplo |
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.
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET