Escolar Documentos
Profissional Documentos
Cultura Documentos
NET
Captulo 1 Conceitos bsicos
1 - Introduo
Desenvolvido a partir do Microsoft ActiveX Data Objects (ADO), o ADO.NET 2.0 uma tecnologia para acesso e manuseio de dados. Apesar do mesmo nome, o ADO.NET diferente conceitualmente do antigo ADO usado em aplicaes VB6, ASP ou Delphi. Enquanto o ADO tradicional foi desenvolvido para trabalhar conectado diretamente ao banco de dados, o ADO.NET foi desenvolvido para acessar o banco para obter dados e manipular as informaes de forma desconectada. No existe um objeto como o recorset, no qual possvel navegar por registros e alterar automaticamente os dados, embora seja fcil construir uma classe para esse fim, se a aplicao necessitar. As novidades do ADO.NET so as aplicaes baseadas na Web, em que os dados a serem transmitidos por conexes em rede esto no formato XML. A conexo com o objeto no ADO.NET feita de forma mais leve em comparao ao ADO, no qual vrios cursores eram suportados pelo recordset e diminuam as opes de personalizao. ADO ADO.NET Connection xxxConnection xxxTransaction Command xxxCommand RecordSet DataSet xxxDataReader xxxDataAdapter No ADO.NET, o recordset do ADO quebrado em mltiplas classes, permitindo que o cdigo em desenvolvimento seja focado em uma rea especfica. As reas so: *DataAdapter: personalizao da forma como a central de dados atualizada com as mudanas do DataSet; *TableAdapter: esta classe anexada a um DataSet e define instrues para incluir, alterar, excluir e pesquisar dados em tabelas; *DataReader: semelhante a um cursos firehose (cursor de somente leitura e avano); *DataSet: classe usada para armazenar informaes do banco de dados, assim como registrar alteraes, podendo ser usada para sincronizar os dados com o servidor. Na tabela a seguir, temos as vantagens encontradas na tecnologia ADO.NET: Vantagem Descrio Manuteno A manuteno de um sistema mais fcil quando o aplicativo desenvolvido em camadas. O modelo do ADO.NET facilita a construo de aplicativos em camadas. Programao O modelo de programao apresenta-se de forma mais concisa. Cada classe tem uma funcionalidade bem especfica.
Interoperabilidade
Performance
Aumento de capacidade
A transmisso em formato XML facilita o uso de um aplicativo em uma intranet ou na Internet. Trabalhar com os dados necessrios em memria mais rpido do que acessar diversas vezes o banco de dados. Uma aplicao bem construda pode se beneficiar muito do modelo de objetos do ADO.NET. Possui um modelo de programao confivel, no havendo necessidade de manter bancos de dados fechados ou conexes de bancos de dados em cache por longos perodos. As aplicaes ficam mais estveis.
3 Modelos de objetos
Na sua maioria, os modelos de objetos do ADO.NET dividem-se em: *Classes Conectadas: este modelo deve ser utilizado especificamente para uma origem de dados e somente trabalhar com aquela origem de dados, podendo conectar-se a ela, recuper-la ou atualiz-la. O modelo de objetos inclui os provedores de classes SQL Server OLE DB, Oracle e ODBC. Outros providers podem ser obtidos com os fabricantes de dados; *Classes Desconectadas: o DataSet utilizado para armazenamento e gerenciamento de dados desconectados do cache, sendo acionado independentemente de qual seja o dado ou seu local originrio.
4 Ambiente conectado
Em um objeto conectado a uma origem de dados, as classes utilizadas nas aplicaes so providas pelos Data Providers .NET e possuem um modelo de objetos comum fornecido pelo ADO.NET atravs de classes base e interfaces. Esses provedores, mostrados a seguir, tambm criam uma linha mnima entre seu cdigo e a origem de dados, melhorando sua performance sem acarretar a diminuio de suas facilidades operacionais.
*OLE DB .NET DATA PROVIDER: faz a conexo e transmisso de dados com SQL Server 6.5 ou anteriores e bancos de dados como Oracle, Microsoft Access, Sybase e DB2/400. Os nomes de suas classes iniciam-se com o prefixo OleDb; *SQL SERVER .NET DATA PROVIDER: torna mais eficaz a conexo e a transmisso de dados com bancos de dados SQL Server 7.0 e SQL Server 2000. Os nomes de suas classes iniciam-se com o prefixo Sql. Um nmero maior de Data Providers .NET posteriormente prover classes e possuir outros prefixos para nomeao das mesmas. Os tpicos a seguir descrevem as funes das classes mais importantes. Os caracteres XXX representam os futuros prefixos a serem adotados, por exemplo Sql ou OLEDB. *XXXDataReader: classe utilizada para leitura de fluxos de dados forward-only e readonly de uma origem de dados; *XXXCommand: um comando executado por essa classes a partir de uma origem de dados; *XXXConnection: classe que se conecta a uma origem especfica de dados; *XXXXmlReader: classe que permite acesso rpido, sem cache e leitura forward-only de um dado em XML. Como visto anteriormente, a classe xxxDataReader atua na leitura de um dado em um determinado Data Server, devendo para tanto obedecer aos seguintes passos: 1. Declarar o objeto xxxConnection para que a conexo ao servidor possa ser efetuada; 2. Declarar um objeto xxxCommand que inclua uma instruo SQL SELECT destinada recuperao de informaes da base de dados; 3. Declarar um objeto xxxDataReader e utilizar o mtodo OPEN para abertura do xxxConnection; 4. Utilizar o mtodo ExecuteReader para executar o objeto xxxCommand. Aps isso, as informaes sero enviadas ao objeto xxxDataReader; 5. Vincular o objeto xxxDataReader a um controle DataGrid ou percorrer os dados utilizando mtodo READ(); 6. Utilizar o mtodo CLOSE para fechar o xxxDataReader e o xxxConnection.
5 Acesso desconectado
Em um ambiente desconectado, as classes utilizadas sero providas pelo namespace System.Data e pelos provedores .NET, sendo que as mais importantes so: *xxxDataAdapter: preenche a atualiza as mudanas ocorridas no DataSet utilizando as classes DataReader, Command e Connection; *xxxDataReader: em conjunto com o DataSet, executa a leitura de fluxos de dados forward-only e read-only de uma origem; *xxxCommand: um comando executado por esta classe a partir de uma origem de dados; *xxxConnection: quando acionado, conecta-se a origem especfica de dados.
1. Configurar o DataAdapter com informaes de conexo e de instruo sql e preencher um DataSet utilizando o mtodo FILL; 2. Processar os dados no DataSet. Atravs dos controles do Windows ou da Web, os dados podem ser escolhidos, mostrados, resumidos ou filtrados; 3. Utilizar o mtodo UPDATE do DataAdapter para atualizar a origem de dados com as modificaes feitas no DataSet.
System.Data.dll: implanta nos namespaces lgicos System.Data.OleDb e System.Data.SqlClient, respectivamente, os provedores OLE DB .NET Data Provider e SQL Server .NET Data Provider; System.Data.Odbc.dll: implanta o ODBC Data Provider; System.Data.OracleClient.dll: implanta o Oracle .NET Data Provider.
VB.NET Accessando o Access dim cn as new System.Data.OleDb.OleDbConnection cn.ConnectionString = Provider=Microsoft.Jet.OLEDB.4.0; Source=c:\banco.mdb; Acessando o SQL Server 6.5 dim cn as new System.Data.OleDb.OleDbConnection cn.ConnectionString = Provider=SQLOLEDB; Data Catalog=Northwind; User ID=sa; Password=; C# //Acessando o Access System.Data.OleDb.OleDbConnection cn System.Data.OleDb.OleDbSqlConnection(); cn.ConnectionString = Provider SQLOLEDB; Data Catalog=Northwind; User ID=sa; Password=;
Data
Source=Localhost;
Initial
= Source=Localhost;
new Initial
OBS: No necessria a incluso da palavra-chave Provider quando se est utilizando o SQL Server .NET, pois, obviamente, a verso ser SQL Server 7.0 ou superior.
cn = Source=Localhost;
new Initial
Uma conexo pode ser criada e gerenciada usando-se os objetos SqlConnection e OleDbConnection, alm dos objetos de conexo que o ADO.NET tem disponveis. Apenas quando esta conexo estiver fechada podem ser configuradas as propriedades de ConnectionString Exemplo: VB.NET Com conexo a banco de dados Access 2000 dim cnA as New OleDb.OleDbConnection() can.ConnectionString = Provider=Microsoft.Jet.OLEDB.4.0; Source=c:\meubancodedados.mdb; C# //Com conexo a banco de dados Access 2000 System.Data.OleDb.OleDbConnection cnA = System.Data.OleDb.OleDbConnection(); cnA.ConnectionString = Provider=Microsoft.Jet.OLEDB.4.0; Source=c:\meubancodedados.mdb;
Data
new Data
SqlConnection cn = new SqlConnection(sb.ConnectionString); Para cada provedor, existe a classe correspondente, como OleDbStringBuilder, OracleConnectionStringBuilder e OdbcConnectionStringBuilder. Todas essas classes so derivadas da classe base DBConnectionStringBuilder.
Uma aplicao acessa um banco de dados por meio do ADO.NET utilizando algumas regras de segurana, por exemplo, informaes de senha e nome de usurio. A disponibilidade destas informaes depender da configurao de segurana do banco de dados que acessado. Para autenticao no SQL Server, podem ser utilizadas: Windows Authentication Pode ser utilizada a conta do prprio Windows, sendo que, no momento do login, so determinados os parmetros de segurana da rede para este usurio. O controlador de domnio do Windows responsvel por realizar a validao destes parmetros de segurana; O acesso pode ser autorizado ou negado, dependendo da verificao que o SQL Server faz na rede com o nome do usurio, sem que a senha e o nome do login sejam verificados; Sempre que um usurio se conectar ao SQL Server, sero verificadas as suas credenciais, pois o gerenciamento do grupo e dos usurios somente pode ser feito por meio do Windows. Caso haja alguma alterao nos direitos de acesso rede de um membro do grupo de usurios conectado, somente no prximo login do Windows ou do SQL Server estas alteraes sero validadas. Assim, podemos verificar alguns servios oferecidos pelo Windows Authentication, tais como: validao e tamanho mnimo de senhas, criptografia e expirao de senhas, auditoria e bloqueio de senha aps tentativas invlidas de login. Mixed Mode Authentication (Windows Authentication e SQL Server Authentication) Os desenvolvedores podem configurar a autenticao para utilizar o Windows Authentication ou o SQL Server para se conectarem, porm, utilizando uma conta de acesso do Windows NT 4.0 ou Windows 2000, estaro conectados de forma segura tanto no Mixed Mode Authentication quanto no Windows Authentication; Se o usurio utilizar um login de conexo no segura, o SQL far a autenticao verificando se a senha est correta, de acordo com a gravada anteriormente, e se a conta est ativada. Caso no esteja, aparecer um aviso de erro e a autenticao no se completar; O SQL Server utilizar o Windows Authentication caso o usurio faa conexo pelo SQL Server 7.0 com o nome de usurio em branco. Se o usurio tentar se conectar ao SQL Server 7.0 com uma configurao do Windows Authentication Mode, este ser utilizado e o login descartado. O login e senha de autenticao do SQL Server so solicitados para o SQL Server 7.0 ou verses anteriores, ou ainda quando o Microsoft Windows 98 roda uma instncia do SQL
Server. Este, enquanto est sendo executado, utiliza o Mixed Mode, pois o Microsoft Windows 98 no suporta o Windows Authentication Mode, apenas a autenticao do SQL Server.
VB.NET dim cn as New SqlClient.SqlConnection cn.connectionstring = Data Source-Localhost ;Initial Catalog=Northwind; Integrated Security=true; cn.Open() cdigo Cn.Close() C# System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(); cn.ConnectionString = Data Source=Localhost; Initial Catalog=Northwind; Integrated Security=true; cn.Open(); // Cn.Close(); Ao abrir uma conexo no banco de dados, muitos recursos do sistema so utilizados e algumas fontes possuem uma quantidade ilimitada para conexes abertas. Por isto, necessrio fech-la, sendo possvel dois mtodos do objeto Connection: Close: quando utilizado, desfaz as transaes pendentes, alm de fechar a conexo; Dispose: remove a conexo do pool de conexes. O objeto xxxConnection possui este mtodo para que recursos no-gerenciveis sejam liberados. Exemplo: VB.NET Conectando e instanciando um novo objeto SqlConnection cn dim cn as New SqlClient.SqlConnection
dim strCon as string strCon = Data Source=Localhost; Initial Catalog=Northwind; cn.ConnectionString = strCon cn.Open() cn.Close() cn.Dispose() C# System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection; String strCon; strCon = Data Source=Localhost; Initial Catalog=Northwind;; cn.ConnectionString = strCon; cn.Open(); cn.Close(); cn.Dispose(); Usamos o modo implcito de abrir e fechar uma conexo quando estamos trabalhando com um objeto DataAdapter. Neste caso, o seguinte procedimento realizado: 1. Os mtodos do objeto DataAdapter, ao serem chamados, verificam se a conexo est aberta; 2. Se a conexo estiver fechada, o DataAdapter abre a conexo e executa as informaes que devem ser processadas; 3. Em seguida, o DataAdapter fecha a conexo. Exemplo: VB.NET dim cn as New SqlClient.SqlConnection (Data Source=Localhost; & _ Initial Catalog=northwind; Integrated Security=true;) Dim da as new SqlClient.SqlDataAdapter(select * from customers, cn) Dim ds as new DataSet implicitamente abre e fecha a conexo Da.fill(ds) C# System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(Data Sourcce=Localhost; Initial Catalog=Northwind; Integrated Security=true;); System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(select * from customers, cn); System.Data.DataSet ds = new System.Data.DataSet(); //abre a fecha a conexo implicitamente Da.fill(ds); OBS: se o objeto de conexo for exigido pela lixeira, ou sair do escopo, as conexes no sero fechadas implicitamente.
Apenas uma conexo ser aberta quando mltiplas tabelas estiverem sendo preenchidas em um DataSet, por meio do mesmo banco de dados (neste caso haver um DataAdapter para cada tabela). Assim, aconselhvel iniciar a conexo, chamar o mtodo Fill dos mltiplos DataAdapter e encerrar a conexo explicitamente, pois, se for usado o modo implcito, a conexo iniciar e encerrar muitas vezes durante o preenchimento das tabelas.
Tratamento de erros
Quando ocorre um erro ou um comportamento inesperado na execuo de um programa ou na execuo de um ambiente, surge uma exceo, ou seja, erros especficos que podem ser manipulados. Em algumas verses anteriores do Visual Basic, havia apenas um erro com informaes ilimitadas, o que tornava necessrio verificar a propriedade do objeto Err para ento descobrir o erro (a instruo Select Case era utilizada para ramificar os blocos de cdigos e acha-lo). As linguagens que utilizam o .NET Framework, hoje em dia, precisam estar prontas para trabalhar com o novo padro de tratamento de erro, o structured exception handling, que nos informa um erro com mais preciso. Isto fez com que todas as linguagens .NET passassem a utilizar o Common Language Runtime (CLR) para interagirem entre si. A classe de excees pode ser criada pelo desenvolvedor a partir de uma base de excees adequadas. Cada classe pode determinar o uso de suas excees com uma stored procedure, um nmero de linha ou erro, um nome de servidor ou uma informao adicional especificada pela tarefa de classe desenvolvida para o desempenho. A manipulao de uma exceo no ADO.NET acontece da seguinte forma: 1. O cdigo dispara uma exceo na aplicao para o cdigo da manipulao; 2. O structured exception handling une uma estrutura de controle de excees, filtros e blocos de cdigos protegidos para detectar erros na execuo de um programa e responder a eles. O .NET Framework possui uma estrutura de controle definida pela instruo Try... Catch... Finally. Se houver erros no bloco Try estes sero tratados pelo Catch. O bloco Catch pode ser utilizado na quantidade que for necessria quando um bloco Try... Catch... Finally utilizado para o tratamento de um erro e, para rodar um bloco sem restries, o bloco Finally deve ser adicionado. Exemplo: VB.NET dim cn as New SqlClient.SqlConnection try tentando efetuar a conexo Dim strCon as string = Data source=Localhost; Initial Catalog=Northwind; Integrated Security=true; Cn = new SqlClient.SqlConnection(strCon) abrindo a conexo
Cn.Open() Catch erro_oper as System.InvalidOperationException ao tentar efetuar uma operao em que a mesma conexo j se encontra aberta, as instrues deste bloco sero executadas e a mensagem a seguir ser exibida. MessageBox.Show(Operao invlida! Banco de dados j est aberto!) Catch erro_exc as System.Exception MessageBox.Show(erro_exc.ToString()) Finally fechar o banco (bloco opcional) Cn.Close() Cn.Dispose() C# dimStatic void abrirCn { System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.Sqlconnection(strCon) Try { //tentando efetuar a conexo String strCon = Data source=Localhost; Initial Catalog=Northwind; Integrated Security=true;; //abrindo a conexo Cn.Open(); } Catch (System.InvalidOperationException erro_oper) { //ao tentar efetuar uma operao em que a mesma conexo j se encontra aberta, //as instrues deste bloco sero executadas e a mensagem a seguir ser exibida. MessageBox.Show(Operao invlida! Banco de dados j est aberto!); } Catch erro_exc as System.Exception { MessageBox.Show(erro_exc.ToString()); } Finally { //fechar o banco (bloco opcional) Cn.Close(); Cn.Dispose(); } }
Obs: iniciar uma conexo um mtodo que pode gerar no apenas uma, mas mltiplas ocorrncias. O desenvolvedor deve estar pronto para manipular as excees e vincul-las aos erros que o SQL enviou aplicao, caso uma SqlException ocorra. Exemplo: VB.NET dim cn as New SqlClient.SqlConnection try tentando efetuar a conexo Dim strCon as string = Data source=Localhost; Initial Catalog=Northwind; Integrated Security=true; Cn = new SqlClient.SqlConnection(strCon) abrindo a conexo Cn.Open() Catch erro_oper as System.InvalidOperationException
ao tentar efetuar uma operao em que a mesma conexo j se encontra aberta, as instrues deste bloco sero executadas e a mensagem a seguir ser exibida. MessageBox.Show(Operao invlida! Banco de dados j est aberto!) Catch SqlExc as SqlClient.SqlException Dim msgerro as String Dim ErroSql as System.Data.SqlClient.SqlError For Each ErroSql in SqlExc.Errors Select Case ErroSql.Number Case 4060 Msgerro =Falha no banco de dados! Contactar o + MsgErro + ="administrador Case 18456 Msgerro = Credenciais do usurio invlidas! End Select MessageBox.Show(msgerro, Mensagens exceptions &_ ErroSql.Number, MessageBoxButtons.OkMessageIcon.Error) Next Finally fechando o banco de dados. este bloco opcional Cn.Close() Cn.Dispose() Cn = nothing End Try C# Static void abrir2() { String StrCon = Data Source=Localhost;Initial Catalog=Turismo;; StrCon += Integrated Security=true;UID=as;pwd=; System.Data.SqlClient.SqlConnection(strCon)// String msgerro = erro; Try { //tentando efetuar a conexo //abrindo a conexo Cn.Open()/ } Catch (System.InvalidOperationException erro_Oper)
{ //ao tentar efetuar uma operao em que a mesma conexo j se encontra aberta, as instrues deste bloco sero executadas e a mensagem a seguir ser exibida. MessageBox.Show(Operao invlida + Banco de dados j est aberto + \n + erro_Oper.Message); Catch } System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.Sqlconnection(strCon) Try { //tentando efetuar a conexo String strCon = Data source=Localhost; Initial Catalog=Northwind; Integrated Security=true;; //abrindo a conexo Cn.Open(); } Catch (System.InvalidOperationException erro_oper) { //ao tentar efetuar uma operao em que a mesma conexo j se encontra aberta, //as instrues deste bloco sero executadas e a mensagem a seguir ser exibida. MessageBox.Show(Operao invlida! Banco de dados j est aberto!); } Catch erro_exc as System.Exception { MessageBox.Show(erro_exc.ToString()); } Finally { //fechar o banco (bloco opcional) Cn.Close(); Cn.Dispose(); } }