Desenvolvimento - ADO.NET

Uma Visão Geral do ADO.NET

ADO.NET é um conjunto de classes do .NET Framework, desenvolvidas para facilitar o acesso das aplicações à bases de dados de diversos tipos, especialmente bancos de dados, como Access, SQL Server, Oracle etc.

por Lucas Húngaro



ADO.NET é um conjunto de classes do .NET Framework, desenvolvidas para facilitar o acesso das aplicações à bases de dados de diversos tipos, especialmente bancos de dados, como Access, SQL Server, Oracle etc.

Representa uma evolução e uma revolução no ADO (ActiveX Data Objects) utilizado até o Visual Basic 6.

ADO.NET é uma evolução desse modelo, e uma revolução pois foi construído “do zero”, sem reaproveitar a tecnologia ADO. Sua única herança é o nome, e mesm o assim somente sua abreviação, pois ADO.NET não significa ActiveX Data Objects.NET e sim, simplesmente, ADO.NET.

A equipe da Microsoft procurou manter m uitos dos conceitos do ADO.NET semelhantes aos do ADO tradicional, apesar de mudar totalmente a sua arquitetura. Com isso os desenvolvedores com experiência no ADO podem se familiarizar com o ADO.NET mais rapidamente.

Na verdade ainda é possível utilizar o ADO tradicional através da interoperabilidade com objetos COM, porém recomenda-se a migração para o ADO.NET, um a arquitetura mais madura e m oderna para acesso a dados.

Pensando no “mundo conectado” no qual vivem os hoje, a Microsoft desenvolveu o ADO.NET com características especiais para facilitar o desenvolvimento nesse contexto:

  • Acesso desconectado: para manipular os dados não é necessário manter ativa uma conexão com a fonte dos dados. Isso é muito importante em aplicações onde o bom desempenho é fundamental, como páginas Web e aplicações para dispositivos móveis. Esse talvez tenha sido o principal foco da equipe de desenvolvimento do ADO.NET e a principal mudança em relação ao ADO tradicional.

  • Integração com XML: o XML é um padrão aberto para transferência de dados. ADO.NET faz sua com unicação nativa em XML, facilitando a interoperabilidade entre plataformas heterogêneas.

  • Tudo pode ser uma fonte: diferente do ADO, que era focado no banco de dados, o ADO.NET tem a habilidade de conseguir extrair dados de diversas fontes, além dos próprios BDs, tais como: arquivos XML e qualquer fonte que puder ser acessada via XML ou OleDb.

  • Representação comum dos dados: permite que os dados sejam manipulados pelos mesmos objetos, independente de sua fonte ser um banco de dados, um arquivo XML ou qualquer outra. Isso permite que os desenvolvedores não se preocupem em como manipular dados de diversas fontes, pois uma vez conhecendo a arquitetura do ADO.NET, a manipulação desses dados é feita sempre de forma muito semelhante.

  • Caching: é possível armazenar dados em cache para melhorar a performance de aplicações ASP.NET.

Com isso o ADO.NET consegue prover aos desenvolvedores grandes vantagens, tais como:

  • Interoperabilidade: através do padrão XML.

  • Escalabilidade: através de recursos como o pooling de conexões e dados desconectados.

  • Produtividade: um modelo de fácil compreensão, e recursos como os Typed Datasets permitem o desenvolvimento rápido de camadas para acesso a dados.

  • Alto desempenho: o modelo desconectado consegue um ganho de performance muito grande, principalmente em cenários de uso intensivo de banco de dados.

Vejamos o modelo de objetos do ADO.NET:

O ADO.NET é dividido em dois grandes grupos:

  • Managed providers: objetos que não armazenam dados, porém se ligam diretamente à sua fonte e conhecem sua origem. Usados para ler e escrever em bancos de dados, são eles: Connection, DataAdapter, Com mand e DataReader. Há classes de acesso a dados especiais para: SQL Server, Oracle, ODBC e OLE DB;

  • DataClasses: são os objetos que podem armazenar e manipular dados, mas não sabem sua origem, nem o que significam. São eles: DataSets, DataTables, DataRows, DataColumns, DataRelations, Constraints e DataView.
Vejamos uma breve descrição das funções de cada objeto:
  • Connection: estabelece a conexão com a fonte de dados.

  • Command: utilizado para envio de Comandos SQL para bases de dados. Amplamente utilizado para executar Stored Procedures.

  • DataReader: objeto que lê um conjunto de dados de forma seqüencial e em modo ReadOnly. Muito utilizado para preenchimento de controles, o que não exige alteração nos dados.

  • DataAdapter: um container para objetos Command. Através desses comandos, um DataAdapter interage com a fonte de dados, fazendo pesquisas, inserções, alterações e exclusões.

  • DataSet: objeto que armazena os dados. É independente do tipo da fonte de dados e pode conter dados de várias delas. Funciona com o um banco de dados em memória, possuindo coleções de tabelas (DataTables), campos (DataColumns), registros (DataRows), constraints (Constraints) e relacionamentos (DataRelations). Os dados que armazena são manipulados em XML por padrão.

  • Typed Dataset: um tipo especial de Dataset , que possui um arquivo Schema (XSD) associado para descrever os tipos de dados. Com isso é possível a validação de tipos e nomes de campos em tempo de design, representando um ganho de produtividade e desempenho na aplicação.

  • DataView: muito semelhante ao objeto View contido em vários bancos de dados. Através desse objeto podemos filtrar e ordenar registros de tabelas.

Providers Específicos

O ADO.NET possui classes par a acesso a bancos de dados específicos: SQL Server (versão 7 e superiores) e Oracle. Essas classes foram desenvolvidas de forma a permitir a obtenção de uma performance melhor em relação às classes genéricas (OleDB e ODBC).

Ex: Manipular dados de um banco SQL Server 2000 é muito mais rápido com a utilização do provider SQL do que utilizando o provider genérico OleDB. Isso acontece pois o provider SqlClient se comunica com o SQL Server em um nível mais baixo do que os outros providers.

Veja:

O provider para SQL Server acessa o banco de dados diretamente, enquanto o provider OleDb passa por camadas intermediárias para chegar à fonte.

A utilização do provider OleDb é recomendada para acesso à bancos SQL Server 6.5 e anteriores, Access e outros que não possuírem classes específicas criadas por seus fabricantes.

A utilização do provider Odbc é recomendada para fontes de dados mais antigas, que suportem somente este modo de conexão.

O provider para SQL Server suporta as versões 7 e superiores, e o provider para Oracle as versões 8.1.7 e superiores desse banco de dados.

Os principais namespaces do ADO.NET são:

  • System.Data
  • System.Data.OleDb
  • System.Data.Odbc
  • System.Data.OracleClient
  • System.Data.SqlClient

Com isso, os objetos pertencentes aos Managed Providers possuem nomes com prefixos diferentes para cada classe:

  • Connection:
    • SqlClient: SqlConnection
    • OracleClient: OracleConnection
    • OleDB: OleDbConnection
    • Odbc: OdbcConnection
  • Command:
    • SqlClient: SqlCommand
    • OracleClient: OracleCommand
    • OleDB: OleDbCom mand
    • Odbc: OdbcCommand
  • DataAdapter:
    • SqlClient: SqlDataAdapter
    • OracleClient: OracleDataAdapter
    • OleDB: OleDbDataAdapter
    • Odbc: OdbcDataAdapter
  • DataReader:
    • SqlClient: SqlDataReader
    • OracleClient: OracleDataReader
    • OleDB: OleDbDataReader
    • Odbc: OdbcDataReader

ADO.NET na prática

Veja abaixo um exemplo da utilização dos objetos SqlConnection, SqlDataAdapter, SqlCommand e DataSet:

"objeto Connection para conexão com a fonte dos dados
Dim cnxNorth As New SqlConnection("integrated security=SSPI;" & _
" data source=(local);persist security info=False;initial" & _
"catalog=Northwind")

"objeto Command para pesquisa no banco de dados
Dim comSelProd As New SqlCommand("SELECT * FROM Products")

"o comando é do tipo texto, usado para instruções SQL
comSelProd.CommandType = CommandType.Text

"devemos também definir a conexão a ser utilizada pelo comando
comSelProd.Connection = cnxNorth

"objeto DataAdapter que conterá o comando para pesquisa
Dim daProdutos As New SqlDataAdapter(comSelProd)

"objeto DataSet que será preenchido pelo DataAdapter criado acima
Dim dsNorthWind As New DataSet

"abrindo a conexão para comunicação com a fonte
cnxNorth.Open()

"o método Fill do DataAdapter executa o comando de pesquisa e
"preenche o objeto passado como parâmetro
"o segundo parâmetro é um string que determina o nome da DataTable
"que armazenará os registros retornados
daProdutos.Fill(dsNorthWind, "Produtos")

"após executar o comando não é mais necessário manter a conexão
"aberta pois o DataSet mantém os dados em memória
"fechando a conexão
cnxNorth.Close()

"Definindo a fonte de dados e a tabela para o DataGrid
grdProdutos.DataSource = dsNorthWind
grdProdutos.DataMember = "Produtos"

Esse código cria os objetos citados e utiliza seus métodos e propriedades para preencher um DataGrid.

Baixe aqui uma apresentação Power Point (PPT) e o código de exemplo referente a este artigo.

Lucas Húngaro

Lucas Húngaro - Líder do GU e Célula Acadêmica .NET Vipers
http://www.ltia.fc.unesp.br/dotnetvipers
LTIA - UNESP - Bauru