Antes de entrarmos nas particularidades de cada ferramenta, veremos a configuração do client do Oracle para que seja efetuada a conexão com o servidor de banco de dados. Esses procedimentos não são necessários para o exemplo em Java pois utilizaremos um driver Classe 4 e, como mostrado no primeiro artigo desta série, esse tipo de driver realiza a conexão diretamente com o servidor.
A configuração do client é armazenada no arquivo tnsnames.ora. Esse arquivo pode ser editado manualmente ou configurado através do assistente Net Easy Config. O assistente é acessível, geralmente, no menu “Network Administration” do Oracle e o arquivo de instalação pode ser encontrado na pasta C:\OraHomeX\NETWORK\ADMIN, onde X é a versão do Oracle. Neste artigo, utilizamos o Oracle 8i Personal.
Ao abrir o assistente os “serviços de rede” já criados são exibidos. Cada serviço de rede é um Alias local para uma instância criada no servidor. No Oracle, uma instância representa um conjunto de processos em memória que gerencia e centraliza o acesso a um ou mais banco de dados.
Na caixa Ações do assistente selecione a opção Criar e na caixa Novo Nome de Serviço de Rede digite SQLMAGAZINE. Este nome será nosso Alias para conexão do client com o servidor.
O segundo passo consiste na definição do protocolo de comunicação que será utilizado. Para conexão com um banco de dados na própria máquina de desenvolvimento, podemos selecionar IPC (Banco de Dados Local). Neste exemplo, utilizaremos TCP/IP, que pode ser utilizado localmente ou em rede.
Em seguida, devemos configurar o protocolo selecionado. Para o TCP/IP é necessário informar o Nome do Host, ou seja, a máquina onde está localizado o servidor de banco de dados, e o número da porta do Listener. Host pode ser o nome da máquina ou o endereço IP da mesma. Para conexão local, podemos utilizar a palavra LOCALHOST. O valor default para a porta do Listener é 1521 (figura 1).
NOTA: Consulte o administrador do banco de dados para saber o endereço IP e o endereço de porta do Listener do servidor.

figura 1 -porta doListener
Na próxima tela indicamos o nome da instância que desejamos conectar (chamada no assistente de “Nome do serviço”). A instância previamente criada no servidor para este exemplo se chama SQLM. Na instalação do Oracle, a instância criada se chama, por default, ORCL.
Nota: Consulte o administrador para saber o nome de Instância do banco de dados.
A última tela do assistente fornece uma interface para teste de conexão. Este teste, por default, utiliza o usuário Scott, criado na instalação do Oracle. Para realizar o teste com outro usuário, basta clicar no botão “Alterar Login”.
Nesse ponto o client está configurado e é possível realizar a conexão de uma aplicação à instância SQLM. Toda a configuração fica gravada no arquivo tnsnames.ora que pode ser editado manualmente para alteração, exclusão ou inclusão de novos aliases. Na listagem 1 é mostrado o conteúdo desse arquivo após a execução do Net Easy Config. Os itens referentes ao protocol, servidor, porta e instância aparecem, nesta ordem, destacados em vermelho.
# C:\ORAHOME8\NETWORK\ADMIN\TNSNAMES.ORA Configuration File:c:\OraHome8\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle Net8 Assistant
SQLMAGAZINE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = LOCALHOST)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SQLM)
)
)
listagem 1 -arquivotnsnames.ora
Como exemplo, a listagem 2 exibe a inclusão manual de um novo serviço de rede, apontando para a instância ISQL no host SVR_SQLMAGAZINE.
# C:\ORAHOME8\NETWORK\ADMIN\TNSNAMES.ORA Configuration File:c:\OraHome8\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle Net8 Assistant
SQLMAGAZINE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = LOCALHOST)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SQLM)
)
)
SQLMAGAZINE_REDE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = SVR_SQLMAGAZINE)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ISQL)
)
)
listagem 2 -inclusão manual de um novo serviço de rede
Conectando com Delphi utilizando DbExpress e ADO
Como vimos na edição anterior, o Delphi disponibiliza vários componentes para conexão com bancos de dados, diretamente vinculados a um engine ou uma API que faz o trabalho de interface entre a aplicação e o client do banco. Como primeiro exemplo, veremos a conexão com a DbExpress.
A implementação do driver dbExpress para conexão com Oracle, dbexpora, faz chamada direta à API OCI (Oracle Call Interface), implementada pelo client para conexão com o servidor.
Na edição anterior conhecemos todo o processo de configuração e conexão da dbExpress com o SQL Server. Basicamente, para fazer uma aplicação dbExpress acessar o Oracle, devemos modificar as propriedades do objeto SQLConnection.
Insira um SQLConnection no formulário, clique com o botão inverso do mouse e selecione “Edit Connection Properties”. Será exibida uma janela mostrando todas as conexões criadas, permitindo alterar, excluir ou incluir uma nova conexão.
Clique no botão “+” para incluir uma nova conexão. Na caixa de diálogo, especifique Driver Name como Oracle e Connection Name como SQLMagazine-Oracle. Connection Name é o nome que será usado pela DBExpress para referenciar a conexão. Clique em OK para voltar.
Em seguida, devemos configurar os parâmetros da nova conexão:
- DataBase – Nome do Alias configurado no arquivo tnsnames.ora, realizado no início da matéria, para conexão com o banco de dados.
- User_Name – Nome do usuário para conexão com o banco.
- Password – Senha do usuário.
Clique em ok para fechar o editor de conexão. A configuração dos objetos para manipulação dos dados deve ser efetuada da mesma forma como mostrado na edição anterior. A aplicação completa está disponível para download.
Outra forma de conexão é através do ADO (Activex Data Objects) da Microsoft. Como vimos na edição anterior, o Delphi disponibiliza um conjunto de componentes para conexão, acesso e manipulação de dados utilizando esta API. O componente responsável pela conexão com o banco é o ADOConnection. Assim como na DBExpress, precisamos apenas alterar as propriedades deste objeto, referenciando-o ao client do Oracle. Para isso, clique com o botão inverso sobre o AdoConnection e selecione “Edit Connection String”. Na caixa de diálogo, marque a opção “Use Connection String” e clique em Build.
Na primeira tela do assistente selecione “Microsoft Ole Db provider for Oracle”. Clique em avançar e configure os parâmetros conforme a listagem:
- “Nome do Servidor” - Nome do Alias criado no arquivo tnsnames.ora para conexão com o banco de dados.
- “Nome de usuário e senha” - Informações de login.
- “Permitir Salvamento de Senha” – Para fazer com que a janela de login do ADO não seja exibida, marque esta opção e configure o valor da propriedade LoginPrompt, do AdoConnection, para FALSE.
A configuração pode ser testada através do botão “Testar Conexão” ou através da propriedade Connected do ADOConnection. A Connection String resultante será:
Provider=MSDAORA.1;Password=TIGER;User ID=SCOTT;Data Source=SQLMAGAZINEApós a configuração do AdoConnection, os passos a serem seguidos são os mesmos efetuados na conexão com o SQL Server. A aplicação completa está disponível para download.
Conectando com VB .NET
Vamos explorar duas formas de implementar esta conexão. A primeira utiliza um driver do tipo OleDB e a segunda utiliza o .NET Provider para Oracle. Ambas precisam do client do Oracle instalado e configurado, como mostrado no início do artigo. A diferença entre elas é que o .NET Provider faz acesso direto à OCI.DLL, sendo apenas uma “interface” que traduz as chamadas da aplicação, garantindo assim maior performance. A OleDb se caracteriza como mais uma camada de procedimentos entre o sistema cliente e a OCI. A vantagem da OleDb é que o código e os componentes utilizados podem ser reaproveitados para a conexão com outro banco de dados, bastando apenas alterar a referência ao driver OleDb utilizado. No caso do .NET Provider para Oracle, os componentes são específicos, dificultando o reaproveitamento do código para acesso a outros bancos de dados.
Vejamos um exemplo de conexão OleDb. Para criar esta aplicação, acesse o menu File\New\Project (figura 2) da IDE do Visual Studio .Net e selecione, na pasta Visual Basic Project, o ícone Windows Application.

Figura 2 – Iniciando um novo Projeto
Uma vez criada a aplicação utilizaremos os componentes da seção DATA da ToolBox (figura 3). O componente OleDb de conexão com o banco de dados é o OleDbConnection (na edição anterior utilizamos um SqlConnection). Adicione este componente e, na propriedade Connection String, selecione “New Connection”. A janela de configuração do ADO que será exibida é a mesma apresentada no uso de ADO com Delphi, mostrado na seção anterior.

Figura 3 – ToolBox
Analogamente aos passos para conexão com o SQL Server, devemos agora inserir um objeto OleDbDataAdapter (na edição anterior utilizamos o SqlDataAdapter). O OleDbDataAdapter é responsável pelo gerenciamento das requisições e execução de comandos INSERT, DELETE e UPDATE. Quando inserimos o componente no formulário, um assistente é exibido, de forma semelhante ao componente SqlDataAdapter. A configuração do assistente deve ser feita da mesma forma como mostrado na edição anterior. Na definição do comando SELECT, consulte o administrador do banco de dados para saber o nome das tabelas disponíveis. Um exemplo pode ser visualizado na figura 4.

Figura 4 – Definição da Frase SQL que irá resultar nos dados para o DataSet associado ao DataAdapter
Em seguida, devemos criar um DataSet. Clique com o botão direito do mouse no OleDbDataAdapter e selecione a opção “Generate DataSet”. Na caixa de diálogo, dê um nome para o DataSet e selecione a origem dos dados a serem exibidos, como mostra a figura 5.

Figura 5 – Caixa de Diálogo “Generate DataSet”
Através do DataSet criado é possível conectá-lo a propriedade DataSource de um componente DataGrid. Para abrir a conexão com o banco de dados utilizaremos o método Open do OleDbConnection e o método fill do OleDbDataAdapter para “preencher” o DataSet passado como parâmetro. Este procedimento foi feito no evento “Form Load”, para garantir que os dados sejam visualizados assim que o form for exibido (figura 6).

Figura 6 – Implementação do Evento FormLoad
Utilizando o .NET Framework Data Provider for Oracle (System.Data.Oracleclient)
Outra opção para acesso é o novo .NET Framework Data Provider for Oracle, lançado em Junho de 2002. Por implementar acesso em managed code .NET e utilizar recursos específicos do Oracle através da OCI, esse provider é mais leve, rápido e flexível do que as classes da OleDbProvider.
As classes do Provider .NET para Oracle estão disponíveis no namespace System.Data.Oracleclient, de forma semelhante ao Provider .NET para SQL Server, que está disponível em System.Data.SqlClient. O Provider pode ser obtido em http://www.microsoft.com/downloads. Uma vez baixado e instalado, este provider deve ser referenciado no VB.NET através da caixa de diálogo "Add reference", disponível no menu Project->Add Reference.
Veja um exemplo de uso deste provider na listagem 3.
Imports System.Data
Imports System.Data.OracleClient
Sub Main()
Dim conn as New OracleConnection()
conn.ConnectionString ="data source=SQLM;user id=scott;password=tiger"
Try
conn.Open()
Console.WriteLine("Conectado com sucesso!")
Catch e as Exception
Console.WriteLine("Não foi possível conectar com o Oracle > " & e.Message)
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
End If
conn.Dispose()
End Try
End Sub
Listagem 3 – Conectando com o Oracle utilizando o OracleClient Data Provider da Microsoft
O uso do bloco Try..Catch..finally, garante o fechamento da conexão mesmo se houver algum erro no processamento. Se a conexão gerar algum erro, a mensagem “não foi possível conectar com o Oracle” será exibida. O componente utilizado para conexão é o OracleConnection.
A execução de uma instrução SELECT e a manipulação do seu resultado é efetuada através dos componentes OracleCommand e OracleDataReader. A listagem 4mostra um exemplo de uso destes componentes.
Sub UseDataReader()
Dim conn as New OracleConnection()
conn.ConnectionString = "data source=SQLM;user id=scott;password=tiger"
Dim cmd As New OracleCommand("select * from emp", conn)
Dim rdr As OracleDataReader
Try
conn.Open()
rdr = cmd.ExecuteReader()
While rdr.Read = True
Console.WriteLine("empno = {0}, ename = {1}", rdr("empno"), rdr("ename"))
End While
Catch e As Exception
Console.WriteLine(e.Message)
Finally
If conn.State = ConnectionState.Open Then
conn.Close()
End If
cmd.Dispose()
conn.Dispose()
End Try
End Sub
Listagem 4 – Executando um select no banco de dados
De forma semelhante ao OleDbDataAdapter, o OracleDataAdapter retorna os dados para um “DataSet desconectado” e gerencia as atualizações deste DataSet através do OracleCommandBuilder. O OracleCommandBuilder utiliza os metadados retornados pela instrução SELECT para montar de forma apropriada os comandos que irão aplicar as alterações no banco de dados. Vide listagem 5.
Sub UseDataSet()
Dim ds As New DataSet()
Dim da As New OracleDataAdapter("select * from emp", _
"data source=SQLM;user id=tiger;password=tiger")
Dim bld As New OracleCommandBuilder(da)
Try
da.Fill(ds, "emp")
Dim r As DataRow
For Each r In ds.Tables(0).Rows
Console.WriteLine("empno = {0}, ename = {1}", r("empno"), r("ename"))
Next
' Altera a linha e executa o update no banco de dados
ds.Tables(0).Rows(0)(2) = "JONES"
da.Update(ds, "emp")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Listagem 5 – Executando alterações no banco de dados
Conectando com Java utilizando JDBC
A Oracle fornece quatro tipos de drivers JDBC: JDBC Thin Driver, JDBC OCI Based Driver, JDBC Server-Side Thin Driver e JDBC Server-Side Internal Driver. Todos utilizam as mesmas APIs, proporcionando flexibilidade e reusabilidade no desenvolvimento de aplicações com JDBC. Confira as diferenças entre cada implementação:
- JDBC Thin Driver: Driver nativo Java, do tipo IV. Utilizado em aplicações que necessitam ser 100% Java e precisam da combinação performance + portabilidade. Por ser do tipo IV, não necessita da presença do client do banco. É o único driver disponível para acesso a banco de dados Oracle através de Applets. Em termos de performance é ligeiramente mais lento do que o OCI Based.
- JDBC OCI Based Driver: Baseado no tipo II, este driver utiliza a OCI (Oracle Call Interface), é dependente de plataforma e necessita do client do banco. Se a aplicação precisa do máximo de performance e pode abrir mão da portabilidade, este é o driver recomendado.
- JDBC Server-Side Thin Driver: Possui a mesma funcionalidade do JDBC Thin Driver, com a diferença de ser executado dentro do servidor de banco de dados, permitindo o acesso a um servidor Oracle remoto. Quanto o Oracle estiver funcionando como um um middle-tier, acessando um banco de dados em outra máquina, este driver deve ser utilizado.
- JDBC Server-Side Internal Driver: Utilize-o para realizar a conexão de classes Java, escritas no servidor Oracle, com o próprio banco de dados. Um bom exemplo é o uso deste driver em Java Stored Procedures que acessam os dados. Como estes drivers sabem que o código está no banco eles não necessitam abrir explicitamente uma conexão. Eles também evitam completamente a latência devido à rede ou à comunicação entre processos.
Todos os quatro drivers utilizam a mesma API. Na prática, isso significa reaproveitamento de código se precisarmos modificar o tipo de driver utilizado. Por exemplo, digamos que uma aplicação cliente-servidor utilize um driver JDBC OCI Based. Caso o desenvolvedor decida migrar parte da aplicação para dentro do banco de dados, precisará apenas modificar as linhas que estabelecem a conexão:
Connection conn = new oracle.jdbc.driver.OracleDriver().defaultConnection();Da mesma forma, o desenvolvedor poderia decidir migrar a aplicação para uma applet Java. Neste caso, a única modificação JDBC necessária seria a especificação do driver thin em vez do driver OCI-based no string de conexão.
Um pequeno exemplo
Vejamos um pequeno exemplo que utiliza o JDBC Thin Driver:
import java.sql.*;
class JDBCExample
{
public static void main(String args[]) throws SQLException
{
DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@sbd:1521:SQLM", "scott","tiger");
// @nome_do_host:porta:nome_da_instância
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(“SELECT ENAME, EMPNO, SAL FROM EMP”);
while (rs.next())
{
String nome = rs.getString(1);
int numero = rs.getInt(2);
double salario = rs.getDouble(3);
System.out.println(nome + “ “ + numero + “ “ +salario);
}
rs.close();
conn.close();
}
}
Na primeira linha indicamos que iremos utilizar o driver da Oracle:
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());Para maiores informações sobre o DriverManager, confira a primeira parte deste artigo.
A próxima linha é:
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@sbd:1521:SQLM", "scott", "tiger");Esta chamada cria uma objeto que representa uma conexão com o banco de dados. A string de conexão é interpretada da seguinte forma:
“jdbc:oracle:thin” - Indica que utilizaremos um JDBC Thin Driver.“@sbd:1521:SQLM” - Especifica que a conexão deverá ser efetuada com a instância SQLM na máquina sbd, cujo listener está na porta 1521. O login será efetuado com o usuário scott e senha tiger. Como o driver é do tipo IV, devemos passar as configurações de conexão através da aplicação.
Agora que a conexão foi estabelecida podemos emitir comandos SQL para o banco de dados:
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(“SELECT ENAME, EMPNO, SAL FROM EMP”);
As últimas linhas, rs.close() e conn.close(), encerram a conexão e a sessão com o banco.
Conclusão
Como vimos, a mudança do SGBD utilizado não afeta muito a forma como a aplicação irá manipular os dados, se restringindo a alterações na implementação de conexão com o banco. É claro que, na vida real, a quantidade de adaptações na aplicação pode ser maior, pois os tipos de campos utilizados, o uso de características proprietárias do banco e o próprio comportamento do driver de conexão podem influenciar na compatibilidade do sistema. No próximo número finalizaremos a série mostrando a conexão com o MySQL. Até lá!