Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«

Outside
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 





Por Dennes Torres
dennes@bufaloinfo.com.br
Dennes Torres possui as certificações MCAD, MCSD,MCSE, MCDBA e MCT. Atualmente atua Como diretor da Búfalo Informática, líder do grupo de usuários DevASPNet no Rio de Janeiro e membro da liderança dos grupos getWindows e devSQL, também do Rio de Janeiro, podendo sempre ser encontrado na lista de discussão do grupo DevASPNet (devaspnet-subscribe@yahoogrupos.com.br) bem como nas reuniões do grupo. Mantém dois blogs em http://cidadaocarioca.blogspot.com

As muitas novidades do ADO.NET 2.0

Pesquisa personalizada
Pesquisar Dicas:






 

O ADO.NET 2.0 possui muitas novidades em comparação com o 1.1 . Irei resumir aqui as principais novidades do ADO.NET 2.0

Alterações nas classes base

No .NET 1.1 as classes dos Data Providers implementavam interfaces padrões, tal como IDBConnection e IDBCommand ( Saiba mais sobre isso lendo o artigo em http://www.devaspnet.com.br/colunas2/coluna0702.aspx )

No .NET 2 as classes dos Data Providers possuem classes base, estas sim implementam tais interfaces. Isso simplifica o trabalho de quem deseja criar um Data Provider, pois as classes base já trazem alguns funcionalidades desenvolvidas, tais funcionalidades são compartilhadas por todos os data providers.

As excessões são o DataAdapter e o CommandBuilder.

Provider Factories

No .NET 1.1 tinhamos que implementar o pattern de abstract factory para permitir uma escolha, até mesmo em run-time, do provider a ser utilizado para conexão a banco. De uma olhada no artigo em http://www.bufaloinfo.com.br/artigos/artigo281104.asp para saber mais sobre isso.

O .NET 2.0 já traz o pattern de Factories pronto, precisamos apenas utiliza-lo. Veja um exemplo :

   58         Dim conString As ConnectionStringSettings

   59         Dim prvFac As System.Data.Common.DbProviderFactory

   60         Dim conn As System.Data.Common.DbConnection

   61 

   62         conString = ConfigurationSettings.ConnectionStrings("appConstring1")

   63 

   64         prvFac = System.Data.Common.DbProviderFactories.GetFactory(conString.ProviderName)

   65 

   66         conn = prvFac.CreateConnection()

 

 

As strings de conexão agora possuem local específico no arquivo de configuração e são recuperadas como sendo instâncias da classe ConnectionStringSettings. Desta forma fica simples obter o ProviderName da connectionString e utiliza-lo para gerar a factory.

A partir da Factory temos diversos métodos de criação dos objetos de banco, tal como o CreateConnection utilizado acima. Observe que a variável conn é do tipo DbConnection e não IDbConnection, o que é uma novidade no .NET 2.0, poderiamos usar tanto a interface como a classe base, ao contrário do .NET 1.1 no qual apenas a interface estaria disponível.

Podemos também verificar se a Factory suporta determinada classe. Isso porque alguns providers tem opção de não implementar determinadas classes. Veja um exemplo :

 

   58         If (prvFac.SupportedClasses And _

   59             Data.Common.DbProviderSupportedClasses.DbConnectionStringBuilder) _

   60             = Data.Common.DbProviderSupportedClasses.DbConnectionStringBuilder Then

   61             MsgBox("Este provider suporta o ConnectionStringBuilder!")

   62         End If

 

Neste caso estamos verificando se esta factory suporta a classe DbConnectionStringBuilder, da qual falarei adiante.

Veja como fica a string de conexão dentro de um arquivo de configuração :

    3 <connectionStrings>

    4     <add name="AppConnectionString1" connectionString="Server=notebook\sql2005;User ID=sa;Password=senha;Database=Northwind;Persist Security Info=True" providerName="System.Data.SqlClient"/>

    5 </connectionStrings>

 

É interessante observar como no .NET 1.1 era uma excelente prática criar um section handle para guardar as strings de conexão, enquanto que no .NET 2.0 isso já foi feito para nós.

Obtenção de Schemas da base de dados

Escrevi há pouco um artigo sobre como utilizar o ADO.NET para obter schemas detalhados dos objetos na base de dados. Veja o artigo em http://www.bufaloinfo.com.br/artigos/artigo13042005.asp

No ADO 2.0 algumas coisas mudaram para melhor :

DataSourceEnumerators

Há algum tempo atrás disponibilizei como dica no site bufaloInfo a possibilidade de listar os servidores sql server disponíveis na rede (Veja em http://www.bufaloinfo.com.br/dicas.asp?cod=215) .

O ADO.NET 2.0 agora trás em seus dataProviders uma classe chamada DataSourceEnumerator que permite listar os servidores de determinado tipo disponíveis na rede.

Veja um exemplo :

 

   58         Dim conString As ConnectionStringSettings

   59         Dim prvFac As System.Data.Common.DbProviderFactory

   60 

   61         conString = ConfigurationSettings.ConnectionStrings("appConnectionstring1")

   62         prvFac = System.Data.Common.DbProviderFactories.GetFactory(conString.ProviderName)

   63 

   64 

   65         Dim obj2 As DbDataSourceEnumerator

   66         Dim dt As DataTable

   67         If (prvFac.SupportedClasses And _

   68               DbProviderSupportedClasses.DbDataSourceEnumerator) _

   69               = DbProviderSupportedClasses.DbDataSourceEnumerator Then

   70             obj2 = prvFac.CreateDataSourceEnumerator

   71             dt = obj2.GetDataSources()

   72             DataGridView1.DataSource = dt

   73         Else

   74             MsgBox("Este provider não suporta enumeração dos datasources")

   75         End If

 

 

DbConectionStringBuilder

Outra classe nova e muito interessante nos Data Providers . Esta classe nos ajudará a fazer a montagem de uma string de conexão, qualquer que seja o Data Provider.

Utilizando esta classe em conjunto com os novos recursos de configuração, sobre os quais Leandro Macedo já escreveu um artigo (veja em http://www.devaspnet.com.br/colunas/coluna1904.aspx ) fica fácil alterar a string de conexão em arquivos de configuração.

Veja um exemplo :

 

   58         Dim conString As ConnectionStringSettings

   59         Dim prvFac As System.Data.Common.DbProviderFactory

   60         Dim config As Configuration

   61         Dim col As ConnectionStringSettingsCollection

   62 

   63         config = Configuration.GetExeConfiguration(Application.ExecutablePath, ConfigurationUserLevel.None)

   64         col = config.ConnectionStrings.ConnectionStrings

   65         conString = col("appConnectionstring1")

   66         prvFac = System.Data.Common.DbProviderFactories.GetFactory(conString.ProviderName)

   67 

   68 

   69         If (prvFac.SupportedClasses And _

   70             DbProviderSupportedClasses.DbConnectionStringBuilder) _

   71             = DbProviderSupportedClasses.DbConnectionStringBuilder Then

   72 

   73 

   74             Dim conBuild As DbConnectionStringBuilder

   75             conBuild = prvFac.CreateConnectionStringBuilder

   76             conBuild.ConnectionString = conString.ConnectionString

   77             If conBuild.ContainsKey("Data Source") Then

   78                 conBuild.Remove("Data Source")

   79                 conBuild.Add("Data Source", "Servidor")

   80                 col("appConnectionstring1").ConnectionString = conBuild.ConnectionString

   81                 config.Update()

   82                 MsgBox("alterado!")

   83             End If

   84         Else

   85             MsgBox("Este provider não suporta a montagem de strings de conexão")

   86         End If

 

 

Melhorias específicas para SQL Server

Existem no ADO.NET 2.0 muitas melhorias que são específicas para o SQL Server. Voltamos então ao eterno dilema : Usar ao máximo os recursos de um servidor para ganhar performance e escalabilidade ou deixar a aplicação mais genérica ?

Sobre isso escrevi um pequeno texto em meu blog, em http://br.thespoke.net/MyBlog/Dennes/MyBlog_Comments.aspx?ID=17739

Enquanto pensam no assunto, vamos ver o que tem de novo.

Maior acesso ao pooling de conexões

Agora através do objeto SQLConnection temos um maior acesso ao pooling de conexões ao banco. Basicamente, temos acesso para estar eliminando uma conexão do pooling ou eliminando todas as conexões do pooling de conexões. Veja um exemplo :

 

   58         'Elimina a conexão con do pooling

   59         SqlConnection.ClearPool(con)

   60 

   61         'Elimina todas as conexões do pooling

   62         SqlConnection.ClearAllPools()

 

Ainda tenho dúvidas sobre o uso adequado deste recurso.

Execuções Assíncronas

O Data Provider do SQL Server ganhou agora o recurso de realizar acessos a banco de forma assíncrona. É bem simples de utilizar, segue os padrões normais do .NET com métodos Begin/End. Assim cada um dos três métodos de execução em um Command (ExecuteReader, ExecuteScalar e ExecuteNonQuery) ganhou um par de Begin/End, possibilitando que esses métodos sejam utilizados de forma síncrona ou assíncrona.

Como é natural nas execuções assíncronas, esses métodos utilizarão recursos de multiThreading, portanto deve-se evita-los, utiliza-los apenas nos casos de haverem reais ganhos com essa execução assíncrona.

Não vou dar um exemplo agora, deixarei para mais a frente no artigo.

Provider Statistics

Com o ADO.NET 2.0 podemos agora obter estatísticas de execução diretamente do objeto de conexão, ficando fácil criarmos recursos para analisar cuidadosamente a performance de nossa aplicação.

Veja um exemplo de como exibir as estatísticas depois de um acesso a banco :

   58         Dim con As New SqlConnection

   59         Dim cmd As New SqlCommand

   60         Dim dr As SqlDataReader

   61         Dim hs As Hashtable

   62 

   63         con.Open()

   64         con.StatisticsEnabled = True

   65         cmd.CommandText = "Select * from authors"

   66         cmd.Connection = con

   67         dr = cmd.ExecuteReader

   68         hs = con.RetrieveStatistics

   69 

   70         For Each di As DictionaryEntry In hs

   71             MsgBox(di.Key & " : " & di.Value)

   72         Next

   73 

   74         dr.Close()

   75         con.Close()

Podemos utilizar este recurso e as execuções assíncronas em conjunto para gerar um bom sistema de armazenagem de estatísticas, veja um exemplo bem bobinho :

   79     Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

   80 

   81         Dim con As New SqlConnection

   82         Dim cmd As New SqlCommand

   83         Dim dr As SqlDataReader

   84 

   85         AddHandler con.StateChange, AddressOf MudouEstado

   86         con.Open()

   87         con.StatisticsEnabled = True

   88         cmd.CommandText = "Select * from authors"

   89         cmd.Connection = con

   90         dr = cmd.ExecuteReader

   91 

   92         'Faz alguma coisa aqui

   93 

   94         dr.Close()

   95         con.Close()

   96     End Sub

   97 

   98 

   99     Public Sub MudouEstado(ByVal sender As Object, ByVal e As StateChangeEventArgs)

  100 

  101         If e.OriginalState = ConnectionState.Executing Then

  102             Dim con As SqlConnection

  103             Dim hs As Hashtable

  104             Dim sb As New System.Text.StringBuilder

  105             Dim cmd As SqlCommand

  106 

  107             con = sender

  108             hs = con.RetrieveStatistics

  109             sb.Append("<estatistica>")

  110             For Each di As DictionaryEntry In hs

  111                 sb.Append("<")

  112                 sb.Append(di.Key)

  113                 sb.Append(">")

  114                 sb.Append(di.Value)

  115                 sb.Append("</")

  116                 sb.Append(di.Key)

  117                 sb.Append(">")

  118             Next

  119             sb.Append("</estatistica>")

  120             cmd = New SqlCommand

  121             cmd.CommandText = "insert into estatistica values('" & sb.ToString & "')"

  122             cmd.Connection = con

  123             cmd.BeginExecuteNonQuery()

  124         End If

  125 

  126     End Sub

 

A execução assíncrona fará com que as estatísticas possam ser registradas afetando o mínimo possível a performance da aplicação. Mas veja algumas considerações sobre o que pode ser melhorado :

MARS

Antes que vocês comecem a achar que estou em órbita ao redor de marte (afinal, só isso justifica o código anterior, que tão obviamente não funciona) devo me explicar.

Como ? Você não notou que o código anterior não funciona ? De uma olhada novamente...

A velha regra : Não podemos executar nada através da conexão enquanto temos um datareader aberto. Assim sendo a execução para gravar as informações de estatística irá gerar erro a menos que utilizemos uma nova conexão.

Vamos a um pouco de histórico. Algumas bases de dados normalmente criam cursores para poderem retornar blocos de dados (Selects), que seja diretamente ou a partir de stored procedures. O SQL Server optou por utilizar um recurso mais otimizado : O SQL Server joga dados de resposta diretamente em pacotes da netLibrary. Esta técnica é conhecida como "The cursorless resultset" e é justamente este método que limita o uso da conexão caso um resultSet esteja sendo utilizado.

Pois eis ai a novidade do SQL Server 2005 : Multiple Active ResultSets - MARS - As network Libraries foram alteradas para dar suporte a este recurso e, portanto, o código acima funciona no SQL Server 2005. Em outros seria necessária outra conexão.

Curiosidade : Você sabia que nos ADOs anteriores ao .NET ao invés de dar erro, como acontece hoje quando vc tenta fazer uma execução através da conexão com um dataReader aberto, o ADO antigo sutilmente abria uma nova conexão por baixo dos panos ? Pois é, eu também não sabia, fiquei sabendo agora, umas duas versões depois...

Client FailOver

O SQL Server 2005 possui um recurso muito interessante : Permite a criação de uma espécie de mirror de uma forma tal que, quando o servidor sair do ar, automaticamente redireciona os clients para o novo servidor.

Veja mais detalhes sobre FailOver Clustering em http://www.databasejournal.com/features/mssql/article.php/3444181

Normalmente o client teria que identificar que ocorreu uma falha em um servidor e desviar-se manualmente para outro servidor. Porém o Data Provider de SQL Server no ADO.NET 2 implementa esta funcionalidade automaticamente, redirecionando o client para o 2o servidor sem que nenhuma codificação especial seja necessária.

Password Changing

O SQL Server 2005 agora se integra com as politicas de segurança do Windows 2003. Assim sendo as senhas de logins Standard do SQL Server irão expirar de acordo com as mesmas regras de expiração de senhas aplicadas pelo administrador da rede para expiração das senhas da rede.

Para saber mais sobre as novas políticas de segurança no SQL Server 2005 veja o artigo em http://www.databasejournal.com/features/mssql/article.php/3461471

O fato é que como se tratam de logins do próprio SQL Server e não do Windows, o usuário não tem acesso a trocar a senha da forma tradicional, então a troca de senha deverá ser um recurso fornecido pela aplicação.

O ADO.NET 2.0 implementa este recurso no Data Provider para SQL Server. O objeto SQLConnection possui um método chamado ChangePassword que permite trocar a senha do usuário conectado.

É interessante observar que com esta nova funcionalidade do SQL Server 2005, aplicações que estiverem guardando nome e senha de usuário standard em seu código não mais funcionarão, já que a senha irá expirar periodicamente.

O melhor acaba sendo a recomendação de best practice que já existe há muito tempo : Utilize logins integrados.

Conclusão

Com estes e muitos outros novos recursos o ADO.NET 2.0 faz com que seja fácil tirar o máximo de proveito do banco



Envie seus comentários sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentários nesta página

Veja abaixo os comentários já enviados :

Nome : SAC E-Mail : sac@americanas.com.br
.
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1