ado.net para iniciantes

Upload: rogerkirk

Post on 17-Jul-2015

135 views

Category:

Documents


0 download

TRANSCRIPT

C# - ADO .NET para IniciantesEste um mini-curso sobre ADO .NET para iniciantes usando a linguagem C#. Os requisitos mnimos para que voc aproveite este mini-curso possuir um pouco de conhecimento sobre lgica de programao. Se voc no conhece a linguagem C# pode ler os seguintes artigos :

Introduo bem bsica ao C# C# - Sintaxe e conceitos bsicos

Se voc j conhece VB .NET e esta querendo a aprender C# sugiro que voc leia o meu artigo:

VB.NET e C# - Guia rpido de referncia comparativa

O material necessrio para acompanhar o curso : (Irei utilizar o Visual C# 2008 Express Edition) 1- Visual C# 2008 Express Edition 2- SharpDevelop 2.2 3- SQL Server 2005 Express Edition Todos esses programas so gratuitos e portanto voc no vai gastar um centavo neste curso. Durante o curso vamos desenvolver uma aplicao com acesso a dados usando C# de forma que voc ir fazendo e aprendendo na prtica os principais conceitos bsicos envolvidos. Mas chega de papo e vamos ao que interessa...

O que ADO .NETADO .NET a nova tecnologia para acesso a dados da plataforma .NET estando integrada ao .NET Framework e oferecendo diversas classes que permitem realizar praticamente todas as tarefas relacionadas com o acesso e manuteno de dados. ADO .NET oferece suporte a uma variedade de opes para desenvolvimento de solues com acesso a dados que permitem a comunicao com qualquer fonte de dados, desde os j conhecidos gerenciadores de banco de dados relacionais (SGBD) como : SQL Server, MySQL, FireBird, Oracle, Sybase, Access, XML, arquivos textos, etc.

Os componentes considerados os pilares da ADO.NET so o DataSet e os provedores .NET que so um conjunto de componentes que incluem os objetos : Connection - responsvel por efetuar a conexo com o banco de dados Command - responsvel por executar comandos contra o banco de dados; DataAdapter - utilizado para preencher o objeto DataSet; Atravs da ADO.NET podemos acessar dados de trs maneiras bsicas: OLE

DB , SQL e ODBC.

Os provedores de dados ADO .NET so livrarias de classes que permitem uma maneira comum de interagir com uma fonte especfica de dados. Cada livraria possui um prefixo que indica qual provedor ela suporta. Veja abaixo os principais provedores: Nome do Provedor API prefixo Descrio Fonte de dados com uma interface ODBC interface. G ODBC Data Provider Odbc dados antigos; OleDb Data Provider OleDb Fonte de dados que expe uma interface OleDb inter Oracle Data Provider Oracle Para banco de dados Oracle; SQL Data Provider Sql Para interao com o Microsoft SQL Server; Nota: Tambm existem provedores fornecidos por terceiros para MySQL, PostGreeSQL, FireBird, etc. Cada objeto possui uma verso para cada uma das maneiras aqui mencionadas, assim temos os objetos : OleDbConnection, OleDbCommand, OleDbDataReader, OleDataAdapter; SqlConnection, SqlCommand, SqlDataReader, SqlDataAdapter; OdbcConnection, OdbcCommand,etc. Nota: Temos tambm os provedores fornecidos por terceiros como o .NET Connector para o MySQL. Abaixo uma figura ilustrando isto:

Existem duas maneiras bsicas de voc realizar a conexo com uma fonte de dados com ADO .NET:

1- ) Usando um DataSetEste modo conhecido como modo desconectado. O objeto DataSet veio para substituir com vantagens o objeto recordset (ADO) e, guarda poucas similaridades com o objeto recordset. Enquanto o objeto recordset representa uma coleo de tabelas de dados O objeto DataSet representa uma cpia do banco de dados em memria. A classe DataSet membro do namespace System.Data e representa o primeiro dos dois maiores componentes da arquitetura ADO.NET os outros membros seriam os provedores Data .NET. Podemos resumir os atributos do DataSet como segue:

baseado em XML

um conjunto de dados em cache que no esta conectado ao banco de dados independente da fonte de dados Pode armazenar dados em mltiplas tabelas que podem ser relacionadas Armazena mltipla verses de dados para coluna e para cada linha em cada tabela

O DataSet fornece as principais funcionalidades para criar aplicaes para banco de dados desconectados , embora suporte tambm o modelo conectado atravs de leitores de dados (DataReader). A classe DataSet derivada da classe System.ComponentModel.MarshalByValueComponent da qual ela recebe a habilidade de ser serializada , includa na caixa de ferramentas do VS.NET e visualmente desenhada em um descritor. Os principais mtodos da classe DataSet so :Membro Colees Relations Tables Descrio Uma coleo de relaes hospedadas em um objeto DataRelationCollection que liga tabelas atravs de chaves estrangeira Uma coleo de tabelas que armazena os dados atuais

Mtodos AcceptChanges Grava todas as alteraes para o DataSet Clear Remove todas as linhas de todas as tabelas Faz uma cpia da estrutura mas no os Clone dados de um DataSet Faz uma cpia a estrutura e os dados de Copy um DataSet Retorna uma cpia do DataSet com apenas as colunas alteradas ou aquelas que GetChanges coincidem com o filtro definido em DataRowState Retorna uma representao exm XML dos GetXml dados Retorna uma representao XML da GetXmlSchema estrutura de um DataSet Retorna um valor indicando que existe HasChanges mudanas pendentes Infere a estrutura de um DataSet baseada InferXmlSchema em um arquivo ou fluxo Merge Mescla o DataSet com o provedor Carrega um esquema XML e dados para um ReadXml DataSet ReadXmlSchema Carrega um esquem XML para um DataSet Reset Reverte o DataSet ao seu estado original Escreve os dados e o esquema XML para um WriteXML arquivo ou fluxo de dados Escreve o esquema XML para um arquivo ou WriteXmlSchema fluxo

2- Usando um DataReader

Os objetos DataReader uma das maneiras mais fceis para ler os dados retornados pelos objetos Command . Eles permitem acessar e percorrer os registros no modo de somente leitura e somente para frente - forward-only . O DataReader no oferece o acesso desconectado e no permite alterar ou atualizar a fonte de dados original sendo usado para obter rapidamente dados de apenas leitura. Apresenta poucos recursos mas seu desempenho muito melhor do que o oferecido pelos DataSet. As propriedades e mtodos mais usadas dos objetos DataReader so : 1. FieldCount - informa o nmero de colunas da linha de dados atual 2. IsClosed - Indica se o objeto DataReader esta fechado. 3. RecordsAffected - especifica o nmero de linhas alteradas , excludas ou includas na execuo de uma declarao SQL 4. Item (n) - obtm o valor da n-sima coluna no seu formato nativo. 5. Close - Mtodo que fecha o objeto 6. GetName - Mtodo que retorna o nome da n-sima coluna. 7. Read - mtodo que permite ao DataReader avanar para o prximo registro 8. IsDbNull - mtodo que informa se a n-sima coluna possui um valor nulo. Para criar um objeto DataReader usamos o mtodo ExecuteReader de um objeto Command.

O objeto DataTableAo tratar com banco de dados no podemos deixar de pensar em tabelas e o objeto DataTable representa uma ou mais tabelas de dados em memria. Os objetos DataTable esto contidos no objeto DataSet e/ou DataView. Abaixo temos uma relao das principais propriedades do objeto DataTable:

Columns - representa as colunas da tabela atravs da coleo de objetos DataColumn (DataColumnCollection) Rows - representa as linhas da tabela atravs de uma coleo de objetos DataRow (DataRowCollection) PrimaryKey - representa a chave primria da tabela atraves dos objetos DataColumn TableName - define o nome do objeto DataTable via coleo DatatableCollection em um objeto DataSet AcceptChanges - Efetiva as alteraes realizadas no DataTable no banco de dados. NewRow - gera um novo objeto DataRow que representa uma linha de dados Copy - copia os dados e a estrutura do DataTable. Clear - limpa os dados de um DataTable. RejectChanges - ignora as alteraes feitas no DataTable.

O objeto DataView

O DataView tem a funo de permitir a ligao dos dados de uma fonte de dados com a interface do usurio atravs do DataBinding . Atravs do DataView podemos filtrar, ordenar, pesquisar e navegar pelos dados oferecendo diversas vises de um mesmo conjunto de dados ao usurio. Usamos o DataView para mostrar uma viso dos dados contidos em um DataTable , com isto voc pode ter vrios DataViews ligados a um mesmo DataTable , sendo que cada um exibe um viso diferente dos dados. O objeto DataTable possui um DataView padro que acessado atravs da propriedade DefaultView. As principais propriedades do objeto DataView so :

RowFilter - retorna uma expresso usada para filtrar os dados a serem exibidos pelo DataView. RowStateFilter - Define a verso dos dados que sero exibidos pelo DataView. Oferece as seguintes opes : o CurrendRows - linhas de dados atuais (linhas no alteradas , novas) o Added - linhas de dados novas. o Deleted - Linha excluda pelo mtodo Delete o None - Nenhuma linha o ModifiedCurrent - linhas de dados que foram modificadas verso atual o OriginalRows - linhas originais o Unchanged - Linhas no modificadas o ModifiedOriginal - linhas de dados que foram modificadas verso original Count - informa o nmero de linhas no DataView aps a aplicao dos filtros : RowFilter e RowStateFilter Item - obtm uma linha de dados de um tabela especificada. Sort - define a coluna que iro ordenar o DataView e o tipo da ordenao ( ASC - ascendente ou DESC - descendente) Addnew - Inclui uma nova linha no DataView Table - Define qual o objeto DataTable de origem para o DataView Delete - exclui uma linha do DataView Find - Busca por uma linha no DataView

Creio que para um incio j temos muita informao, na sequncia irei mostrar como realizar uma conexo com um banco de dados usando ADO .NET com C#.

As Classes e os Namespaces da ADO .NET

O seis principais namespaces (espaos de nome) da ADO .NET so mostrados abaixo resumidamente :Namespaces Descrio o principal espao de nomes da ADO .NET e contm as classes usadas por todos os provedores; classes que representam tabelas, colunas, linhas e tambm a classe DataSet. Alm disso possui diversas interfaces como IDbCommand, IDbConnection, e IDbDataAdapter que so usadas por todos os provedores gerenciados.

System.Data

Define as classes comuns usadas como classes base para os provedores de dados. Todos eles System.Data.Commom compartilham estas classes. Ex: DbConnection e DbDataAdapter. System.Data.OleDb Define classes que trabalham com fonte de dados OLE DB usando o provedor .NET OleDb. Define classes que trabalham com fonte de dados ODBC usando o provedor .NET Odbc. Define classes que trabalham com fonte de dados SQL Server 7.0 ou superior.

System.Data.Odbc System.Data.SqlClient

System.Data.SqlTypes

Define classes que representam tipos de dados especficos para o SQL Server.

A ADO .NET possui 3 tipos distintos de classes referenciadas como:

Disconnected - Classes que fornecem a estrutura bsica para o framework ADO .NET. Ex: A classe DataTable. Os objetos desta classe so capazes de armazenar dados sem qualquer dependncia de um provedor especfico; Shared - Classes que Formam as classes bases para os provedores de dados e so compartilhadas entre todos os provedores; Data Providers - So classes que so usadas com diferentes tipos de fonte de dados para realizar operaes de gerenciamento de dados em um banco de dados especfico.

Os provedores de dados contm objetos Connection, Command, DataAdatper e DataReader que foram apresentados na primeira parte deste artigo. Com ADO .NET voc primeiro cria um objeto Connection e fornece ao mesmo informao sobre a string de conexo. A seguir voc criar um objeto Command e fornece a ele detalhes da instruo SQL que dever ser executada. Esta informaes pode usar parmetros. Se o objeto Command retornar um conjunto de registros e voc decidir us-lo dever criar um objeto DataAdapter e preencher um objeto DataSet ou DataTable.

Usando o objeto ConnectionUm objeto Connection cria uma ligao (ou conexo) com uma fonte de dados especfica. Este objeto deve conter a informao necessria para se conectar a fonte de dados usando informaes como o provedor, o caminho da base de dados, o usurio e a senha (se necessrio). Esta informao esta contida na string de conexo. Esta informao tambm pode ser armazenada no arquivo web.config , em um arquivo texto, no registro do windows, etc. Cada tipo de provedor de dados possui um objeto connection especfico, assim um provedor de dados que trabalha com uma fonte de dados SQL Server inclui uma classe SqlConnection que realiza este tipo de operao. J um provedor que trabalha com uma fonte de dados OLE DB possui uma classe OleDbConnection. Obs: Podemos tambm efetuar a conexo com outros banco de dados como MySQL, FireBird, PostGreSQL , DB2, etc. Neste caso ser necessrio usar um conector apropriado geralmente fornecido pelo fabricante ou usar um provedor de dados ODBC(no muito recomendvel). De forma geral podemos descrever as propriedades para uma classe Connection assim :

Propriedade

Descrio

Contm informaes pelo objeto ConnectionString Connection para efetuar a conexo com o banco de dados; DataBase DataSource Retorna o nome do banco de dados aps a conexo ser aberta; Retorna o nome da instncia do banco de dados usado pelo objeto Connection; Retorna o estado atual da conexo: Valores possveis : State

Broken Closed Connecting Executing Fetching Open

A seguir temos o trecho de cdigo genrico usado para efetuar a conexo com o SQL Server : using System.Data; using System.Data.SqlClient; //1-definio das informaes para montar a string de conexo string Server = "localhost"; string Username = "usuario"; string Password = "senha"; string Database = "banco de dados"; //2-montagem da string de conexo string ConnectionString = "Data Source=" + Server + ";"; ConnectionString += "User ID=" + Username + ";"; ConnectionString += "Password=" + Password + ";"; ConnectionString += "Initial Catalog=" + Database; //3-cria uma instncia do objeto Connection em memria SqlConnection

SQLConnection = new SqlConnection(); try { //4- atribui a string de conexo e abre a conexo SQLConnection.ConnectionString = ConnectionString; SQLConnection.Open(); //realiza alguma operao ...... } catch (Exception Ex) { MessageBox.Show(Ex.Message); } Para a conexo com o SQL Server podemos tambm declarar e instanciar o objeto SqlConnection ao mesmo tempo conforme o cdigo abaixo:

SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");Neste caso o objeto SqlConnection instanciado usa um construtor com um nico argumento do tipo string , a famosa string de conexo. Veja a seguir sua descrio detalhada :Data Source Initial Catalog Integrated Security User ID Password

Identifica o servidor e pode ser a mquina local (localhost), um dns ou um en O nome do banco de dados

Defina para SSPI para fazer a conexo usando a autenticao do WIndows.(Usaseguro somente quando voc esta em uma mquina fora da rede)

Nome do usurio definido no SQL Server. Senha do usurio definida no SQL Server.

Um exemplo de conexo com o meu servidor MAC/SQLEXPRESS usando o banco de dados Northwind.mdf com o usurio macoratti e senha 123456 seria: SqlConnection conn = new SqlConnection("Data Source=MAC/SQLEXPRESS;Initial Catalog=Northwind;User ID=macoratti;Password=123456");

A sequncia de operaes que ocorrem quando da abertura de uma conexo pode ser resumida assim: Instancia um objeto SqlConnection ou OledbConnection; Abre a conexo; Passa a conexo para outro objeto ADO .NET(command); Realiza a operao no banco de dados(uma consulta); Fecha a conexo;

Um exemplo completo bem simples pode ser visto a seguir: using System; using System.Data; using System.Data.SqlClient; /// /// Demonstra como trabalhar abrir uma conexo com SqlConnection /// class SqlConnectionDemo{ static void Main() { // 1. Instancia a conexo(objeto SqlConnection) SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI"); // // define um SqlDataReader nulo SqlDataReader dr = null; try { // 2. Abre a conexo conn.Open(); // 3. Passa conexo para o objeto command SqlCommand cmd = new SqlCommand("select * from Customers", conn); // // 4. Usa conexo // obtm o resultado da consulta dr = cmd.ExecuteReader(); // imprime o codigo do cliente para cada registro while (dr.Read()) { Console.WriteLine(dr[0]); }

} finally { // fecha o reader if (dr != null) { dr.Close(); } // 5. Fecha a conexo if (conn != null) { conn.Close(); } } } } O cdigo usa um objeto SqlCommand o qual realiza uma consulta na tabela Customers. O resultado retornado como um SqlDataReader e o loop While percorre e l a primeira coluna de cada linha do conjunto de registros retornados que a coluna CustomerID. (poderamos ter obtido mais colunas como dr[1], dr[2], etc.) Nota: Podemos tambm obter os dados das colunas pelo nome dos campos : Ex: dr["CustomerID"]. Ao usar o objeto Connection voc deve sempre ter o cuidado de fech-lo caso contrrio haver impacto no desempenho da sua aplicao, por isso estou usando um bloco Try/Finally, onde o bloco Finally garante que a conexo ser fechada pois sempre ser executado. Note que tomamos a precauo de verificar se a conexo e o objeto DataReader eram nulos antes de fech-los para evitar uma exceo. Este exemplo mostra como usar o SqlConnection com o objeto SqlDataReader o qual requer que a conexo seja fechada explicitamente.