Está en la página 1de 15

Desenvolvimento Código Aberto

Centro de Desenvolvimento Profissional Aberto – Mais de 600 códigos e 100 ferramentas.
fique atualizado via rss

DAO – Data Access Object – Pattern – CRUD – Oracle –
IBM DB2 – MSSQL Server – C#
Publicado: 11 de dezembro de 2014 em C# 

0
No ciência da computação, Data Access Object é um padrão para um objeto que fornece uma
interface abstrata para algum tipo de banco de dados ou outro mecanismo de persistência e que
permite separar regras de negócio das regras de acesso a banco de dados. A vantagem de usar objetos
de acesso a dados é a separação simples e rigorosa entre duas partes importantes de uma aplicação
que não devem e não podem conhecer quase que nada uma da outra, e que podem evoluir
frequentemente e independentemente.
O DAO implementa o mecanismo de acesso necessário para trabalhar com a fonte de dados. A fonte
de dados pode ser um armazenamento persistente como um RDBMS, um serviço externo, como uma
troca de B2B, um repositório como um banco de dados LDAP, um serviço de negócios acessado
via CORBA, Internet Inter‑ORB Protocol (IIOP) ou soquetes de baixo nível. O componente de
negócio que se baseia no DAO usa a interface mais simples exposta pelo DAO para seus clientes.
Microsoft, C# e DAO
O DAO Pa玜�ern J2EE não deve ser confundido com o DAO método de acesso a dados da Microsoft .
O DAO (Microsoft) fornece um quadro para a utilização de código para criar e manipular bancos de
dados através de um conjunto hierárquico de objetos que usam o mecanismo de banco de dados
Microsoft Jet para arquivos MDB, ou através de ODBC ou também banco de dados IASM como o
antigo DBase, Paradox entre outros. O DAO Microsoft é considerado obsoleto e não é suportado
pelo .NET Framework.
Devido a similaridade do C# com o Java é possível utilizar integralmente o DAO Pa玜�ern que é um
padrão já consagrado por desenvolvedores Java para separar a camada de negocio da camada do
banco de dados. O DAO é um célebre Pa玜�ern utilizado sozinho ou também em conjunto com outros
frameworks, provavelmente alguns desenvolvedores C# já o utilizaram de algum modo,
implicitamente ou explicitamente, mesmo sem o conhecer em detalhes.

4. Update e Delete. 3. O Data Access Object abstrai a implementação fundamental de acesso a dados para o Business Objects para permitir acesso transparente à fonte de dados. DB2DAOFactory e assim por diante.(h玜�ps://desenvolvimentoaberto.html) CRUD – DAO CRUD acrónimo de Create. repositório XML. uma GUI desktop ou aplicações web. DataSourceObject. Para usar o DAO você utiliza o Factory Pa玜�ern para criar uma abstração para o acesso a dados e uma classe concreta para seu tipo de acesso como por exemplo OracleDAOFactory. TransferObject – representa um objeto de transferência usado como um suporte de dados. DAO Pa玜�ern: h玜�p://www.oracle.com/technetwork/java/dataaccessobject‑138824. Uma fonte de dados pode ser uma base de dados tal como um RDBMS. O Data Access Object pode usar um objeto de transferência para retornar dados para o cliente. O DAO é um Pa玜�er J2EE. DataSourceObject – representa uma implementação da fonte de dados. Read.jpg) DAO – CRUD – C# DAO Pa玜�ern O DAO é um padrão flexível e não uma regra ele é utilizado em conjunto com Factory Pa玜�ern e Broker Pa玜�ern (veja Pa玜�erns relacionados no link abaixo) por isto é comum você encontrar algumas variações de sua implementação. mas como ele separa as regras de negocio do acesso a dados também podemos utiliza‑lo com qualquer tipo de interface. 1. atualização e exclusão de dados. utiliza as quatro operações básicas  para criação. consulta. . BussinesObject – o objeto de negócios representa o dados do cliente. DataAccessObject – é o objeto principal desse padrão. Então você pode criar a interface para seu objeto DAO chamada DAOFuncionario e a partir da interface você pode criar as classes DAO como. e assim por diante.com/technetwork/java/dataaccessobject‑138824. BussinesObject e TransferObject.files. O Data Access Object também pode receber os dados do cliente em um objeto de transferência para atualizar os dados na fonte de dados. o padrão possui quatro especificações para que possa ser utilizado corretamente elas são: DataAccessObject. DAOFuncionarioOracle.html (h玜�p://www.com/2014/12/dao‑cs‑1‑programa. É o objeto que requer acesso à fonte de dados para obter e armazenar dados.wordpress. Através do padrão DAO vamos utilizar as operações CRUD para manipular dados no banco de dados. 2. seja pela linha de comando.oracle.

Visual Studio Crie um design como na figura abaixo.   Cargo           VARCHAR2(30).wordpress. Pare ver este programa usando objetos no banco de dados como Views e Triggers clique aqui (h玜�ps://desenvolvimentoaberto.com/2014/12/dao‑cs‑2‑design. cortamos caminho pois utilizamos apenas um objeto DAO para todos os bancos de dados.   Salario         NUMBER(9.wordpress.com/2014/06/03/database‑command‑executenonquery‑ oracle‑ibm‑db2‑microsoft‑sql‑server‑c/).2)).files. como este exemplo não possuí uma tela de login mude o acesso ao banco e usuário e senha diretamente na classe FuncionarioDAO. SQL Oracle 1 2 3 4 5 6 7 DB2 ‐‐ Cria tabela de funcionarios create table Funcionarios(   ID_Funcionario  NUMBER(5). Este é o terceiro método que disponibilizamos para manipular dados através de um banco de dados.jpg) Design Time Atente‑se a organização dos Namespaces para cada classe e os drivers utilizados para cada banco de dados.wordpress. DAOFuncionarioOracle. 7 Labels. Ainda veremos outros métodos para manipular dados através de frameworks específicos como Entity Framework e outros. mas caso deseje criar uma abstração para classes concretas para cada banco de dados siga a especificação oficial do DAO Pa玜�ern no link logo acima. utilizando 3 Panels.com/2014/08/13/database‑views‑oracle‑ibm‑db2‑ microsoft‑sql‑server‑c/) ou procure na busca também por Stored Procedures e cursores. Neste exemplo não criamos uma classe abstrata utilizando o Pa玜�ern Factory.   Nome            VARCHAR2(30).e a partir da interface você pode criar as classes DAO como. DAOFuncionarioDB2 e utilizar o objeto de transferência para manipular os dados. 6 TextBox e 5 Bu玜�ons: (h玜�ps://desenvolvimentoaberto. . Exemplo: Neste exemplo usamos o Pa玜�ern DAO para criar operações CRUD utilizando uma interface gráfica. para ver este mesmo programa utilizando SQL direto da aplicação clique aqui (h玜�ps://desenvolvimentoaberto.   Sobrenome       VARCHAR2(70).

salario = salario.             this.         private string cargo.Collections. string sobrenome. using System.             string cargo.Threading.    Cargo           VARCHAR(30). MSSQL 1 2 3 4 5 6 7 ‐‐ Cria tabela de funcionarios create table Funcionarios (    ID_Funcionario  Int.    Nome            VARCHAR(30).Generic. string nome.Tasks.2)). using System. double salario)         {             this.cargo = cargo.         private double salario.         }           // Declara propriedades         // Caso deseje pode utilizar metodos Getter e Setters         public long Id         { . C# Objeto – Funcionario 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 using System.    Sobrenome       VARCHAR(70).     Cargo           VARCHAR(30).         private string sobrenome.sobrenome = sobrenome.Modelo {     class Funcionario     {         // Declara atributos         private long id.DB2 1 2 3 4 5 6 7 ‐‐ Cria tabela de funcionarios create table Funcionarios (     ID_Funcionario  INTEGER.           // Declara construtor padrão         public Funcionario()         {           }           // Declara construtor overload         public Funcionario(long id.     Sobrenome       VARCHAR(70).id = id.   namespace DesenvolvimentoAberto.Linq.Text.             this.nome = nome.    Salario         Decimal(9.2)).         private string nome.             this. using System.     Nome            VARCHAR(30).             this. using System.     Salario         NUMERIC(9.

            }         }       } } Factory Pa玜�ern – DAConexaoFactory 1 using System.             }             set             {                 salario = value. .             }         }         public string Sobrenome         {             get             {                 return sobrenome.             }             set             {                 nome = value.38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94         {             get             {                 return id.             }         }         public string Cargo         {             get             {                 return cargo.Collections.             }         }         public string Nome         {             get             {                 return nome.             }             set             {                 sobrenome = value.             }             set             {                 cargo = value. 2 using System.             }         }         public double Salario         {             get             {                 return salario.Generic.             }             set             {                 id = value.

Open().DbProviderFactory factory.Text. string usuario.Data.2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 using System.Data Source=xe".           // Define Driver         private static System.Common. using System.Windows.Forms.    // ADO.CreateConnection().                 } 63   .         private static DbConnection connUnica = null. // ODAC 12c using IBM.           // cria conexões         // você pode alimentar o nome do servidor.       // DbProviderFactory   namespace DesenvolvimentoAberto.Data.Password=" + senha +                        // TNSnames                     ".DataAcces                       connUnica = factory.Linq.Client.           public static DbConnection getConexao(int fabrica.Conexao {       class DACconexaoFactory : DbProviderFactory     {         // Cria objetos de conexão         private static string connectionString.                     connUnica.DB2. timeout e banco de dados         // de alguma configuração global ou como achar melhor. using System.         private static Exception erro.   using System. using System.Tasks.          {            factory = new DACconexaoFactory().Common.Data.DataAccess.NET using Oracle.SqlClient.             // IBM Data Server Provider   using System.                     connUnica.ConnectionString = connectionString.GetFactory("Oracle.         public static readonly int DB2 = 2.                       // ODAC 12c                     factory =  DbProviderFactories.           // Define tipos de datasource         public static readonly int ORACLE = 1.         public static readonly int MSSQL = 3. using System.Generic.Collections.Data.              if (fabrica == ORACLE)             {                 try                 {                     // String de Conexao                     connectionString =                        // Usuario                     "User Id=" + usuario +                        // Senha                     ".Threading.

PWD=" + senha +                      // TNSnames                    ".UID=" + usuario +                      // Senha                    ".Database=DevAberto" +                       // Usuario                    ".GetFactory("IBM.DB2"                      connUnica = factory.PWD=" + senha + 124   .UID=" + usuario +                      // Senha                    ".                      // IBM DATA Server Provider                    factory = DbProviderFactories.                    connUnica.ConnectionString = connectionString.                }            }              if (fabrica == MSSQL)            {                try                {                    // String de Conexao                    connectionString =                      // Servidor                    "Server=localhost" +                       // Banco de dados                    ".Database=DEVA" +                       // Usuario                    ".CreateConnection().                }                  catch (Exception ex)                {                    erro = ex.                    connUnica.                 }             }              if (fabrica == DB2)            {                try                {                    // String de Conexao                    connectionString =                      // Servidor                    "Server=localhost" +                      // Banco de dados                    ".Open().Connect Timeout=40".Data.63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123                    catch (Exception ex)                 {                     erro = ex.

               }                  catch (Exception ex)                {                    erro = ex.         }           // Recupera Driver         public static DbProviderFactory getFactory()         {             return factory.124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156                      // TNSnames                    ".Connect Timeout=40".GetFactory("System.Open().         }       } } Interface – IFuncionarioDAO 1 using System.                      // ADO NET Nativo ‐ MSSQL Server                    factory = DbProviderFactories.                    connUnica.                    connUnica.Data. .SqlCli                      connUnica = factory.         }         // Recupera Erro         public static Exception getErro()         {             return erro.ConnectionString = connectionString.                }            }             return  connUnica.CreateConnection().

Generic.Dao {     interface IFuncionarioDAO     {         // Cria interface         // A interface propricia os retornos corretos de cada operação.Tasks. using System.               try             {                 this.   namespace DesenvolvimentoAberto.Generic.Tasks.           Boolean deletaFuncionario(Funcionario funcionario). using System.Text.Modelo. "user".   using DesenvolvimentoAberto.Text.Dao {     class FuncionarioDAO : IFuncionarioDAO     {         // Declara objetos         private DbConnection conn.   namespace DesenvolvimentoAberto.Collections. using System.conn = DACconexaoFactory.Data.           public FuncionarioDAO()         {             // Como o exemplo não possui uma tela de login             // utilizamos uma adaptação no construtor da classe             // você pode utilizar um login para que o factory da conexão             // use a string de conexão completa.           Boolean updateFuncionario(Funcionario funcionario).Linq. using System.Modelo. using System.         private Exception erro.         private string sql. "password" 31             } . using System.           Funcionario buscaFuncionario(string id).Threading. using System. using System.Threading. using DesenvolvimentoAberto. using System.           // TODO: Insira outros metodos que você deseje que sejam obrigatorios. using System.Linq.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 using System.Conexao.   using DesenvolvimentoAberto.Common.SqlTypes.getConexao(1.           Boolean insereFuncionario(Funcionario funcionario).Collections.       } } Objeto DAO – FuncionarioDAO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 using System.Data.

                cmd.GetString(2).GetString(1).Cargo = dados. '" +                   funcionario.ExecuteReader().Salario)) + ")"               try             {                 // Cria Conexão Driver especifico 92                 DbCommand cmd = DACconexaoFactory.GetInt32(0).Cargo + "'.Read())                     {                         funcionario. '" +                   funcionario.getFactory().                 cmd.Salario = Convert.GetString(3).                 cmd.                   // Converte Decimal para Double para IBM DB2 e MSSQL                 if (dados.Id = dados.Nome + "'.             }           }         public Modelo.CreateCommand().ToDouble(dados.         }           public bool insereFuncionario(Modelo.                         funcionario.Connection = conn.CreateCommand().31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91             }             catch             {                 erro = DACconexaoFactory.GetDecimal                     }                 }               }             catch (Exception ex)             {                 // Retorna erro                 erro = ex.                         funcionario.ExecuteNonQuery().Sobrenome + "'.getErro().                   // Cria set de dados                 DbDataReader dados = cmd.HasRows)                 {                     while (dados.Sobrenome = dados.Funcionario funcionario)         {             // Define SQL             // Troca decimal é requerido se Oracle/DB2 for ptbr.Funcionario buscaFuncionario(string id)         {             // Cria objeto             Funcionario funcionario = new Funcionario().                         funcionario.getFactory(). " +                   trocaDecimal(Convert.               sql = sql = "SELECT * FROM FUNCIONARIOS WHERE ID_FUNCIONARIO = "               try             {                 // Cria Conexão Driver especifico                 DbCommand cmd = DACconexaoFactory. .ToString(funcionario.Id + ".             sql = "INSERT INTO FUNCIONARIOS VALUES ("                 + funcionario.CommandText = sql. '" +                   funcionario.             }             return funcionario.Nome = dados.                         funcionario.

getFactory(). " +                 "NOME = '" + funcionario.getFactory().Id.Connection = conn.         }           public bool updateFuncionario(Modelo.                 conn.                   cmd.                 conn.             try             {                 // Cria Conexão Driver especifico                 DbCommand cmd = DACconexaoFactory.Sobrenome + "'. " +                 "CARGO = '" + funcionario.                 cmd.92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152                 DbCommand cmd = DACconexaoFactory. 153                 return true.                   cmd.CommandText = sql.                 cmd.             }               return false.Close().Connection = conn.                 return true.                 cmd.Funcionario funcionario)         {             // Define SQL             sql = "DELETE FROM FUNCIONARIOS WHERE ID_FUNCIONARIO = " + funciona               try             {                 // Cria Conexão Driver especifico                 DbCommand cmd = DACconexaoFactory.Close(). " +                 "SOBRENOME = '" + funcionario.         }           public bool deletaFuncionario(Modelo.CommandText = sql.                 cmd.CreateCommand(). .             }             catch (Exception ex)             {                 // Retorna erro                 erro = ex.Close().CreateCommand().Id + ".ExecuteNonQuery().ToString(funcionario.             }               return false.ExecuteNonQuery().                 cmd.             }             catch (Exception ex)             {                 // Retorna erro                 erro = ex.Nome + "'.CreateCommand().Cargo + "'.                 conn.ExecuteNonQuery().CommandText = sql.                   cmd.Funcionario funcionario)         {             // Define SQL             sql = "UPDATE FUNCIONARIOS SET " +                 "ID_FUNCIONARIO = " + funcionario.                 cmd.Connection = conn.getFactory().                 return true.Salari                 "WHERE ID_FUNCIONARIO = " + funcionario. " +                 "SALARIO = " + trocaDecimal(Convert.

Collections. using System.Data. using System.Text.buscaFuncionario(textBox6. using System.             }             catch (Exception ex)             {                 // Retorna erro                 erro = ex. .ComponentModel. using System.   using DesenvolvimentoAberto. using System.         }     } } GUI – Aplicação – Windows Form 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 using System. using DesenvolvimentoAberto.Drawing.Text).         }           private static String trocaDecimal(string conteudo)         {             // Substitui decimal na manipulação de SQL             return conteudo. using System.Modelo. using System.Threading.         }           // Retorna erro         public string getErro()         {             return erro.               // Executa busca 34             funcionario = new FuncionarioDAO(). ". EventArgs e)         {             // Cria objeto             Funcionario funcionario = new Funcionario().Generic.".Forms.").             }               return false.   namespace DACampos {       public partial class Campos : Form     {           public Campos()         {             InitializeComponent().Dao. using System.ToString().         }           // Utiliza DAO           // Evento de clique do botão Pesquisar         private void button1_Click(object sender.153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176                 return true.Windows.Linq.Tasks.Replace(".

            textBox4.Sobrenome.Salario). Convert.ToInt32(textBox1.Focus().Text = funcionario.SelectAll().Cargo.             textBox2. EventArgs e)         {             // Cria objeto do modelo usando o construtor overload             Funcionario funcionario = new Funcionario(Convert.                 textBox6.Id).Id.Text.                 textBox6.Nome.Text = Convert.Text. textBox4.").".                 textBox3.Text.             }             else             {                 MessageBox.Text = null.insereFuncionario(funcionario).               // Define foco             textBox1.Text = null.               if (resultado != 0)             {                 textBox1.Text = funcionario.Text = Convert.             textBox5.ToString(funcionario. textBox3. ".         }           // Insere registro         private void button3_Click(object sender.ToDouble(t               // cria objeto DAO             FuncionarioDAO inserir = new FuncionarioDAO().                 textBox2.             }           }           private static String trocaDecimal(string conteudo)         {             // Substitui decimal na manipulação de SQL             return conteudo.             }             else 95             { .Replace(".Text = funcionario.             textBox3.ToString(funcionario.Show("Dados inseridos com sucesso").Focus().34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94             funcionario = new FuncionarioDAO().               // Verifica resultado             if (resultado)             {                 MessageBox.         }           // Novo registro         private void button2_Click(object sender.Text = null.               // Insere objeto             Boolean resultado = inserir.Text).Show("Funcionário não encontrado!").Text = null.Text = null.                 textBox5.                 textBox2.               // Verifica resultado             long resultado = funcionario.                 textBox4.buscaFuncionario(textBox6. EventArgs e)         {             // Limpa componentes             textBox1.

Focus().getErro()).Show("Erro ao alterar dados:" + Environment.PerformClick().Text.Text.Text.updateFuncionario(funcionario). textBox4.               // Verifica resultado             if (resultado)             {                 MessageBox.NewLine +                     alterar.                 textBox6.ToDouble(tr               // Cria objeto DAP             FuncionarioDAO apagar = new FuncionarioDAO().NewLine +                     inserir.Text.Text.             }             else             {                 MessageBox. EventArgs e)         {             // Cria objeto do modelo usando o construtor overload             Funcionario funcionario = new Funcionario(Convert.ToInt32(textBox1.getErro()).Show("Dados alterados com sucesso").               // verifica resultado             if (resultado)             {                 MessageBox.ToInt32(textBox1.Show("Erro ao alterar dados:" + Environment. Convert. textBox4.             }           }           // Altera registro         private void button4_Click(object sender.                textBox2.95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155             {                 MessageBox.Text.             }             else             {                 MessageBox.                textBox2.ToDouble(tr               // Cria objeto DAO             FuncionarioDAO alterar = new FuncionarioDAO().NewLine                      Environment.               // Deleta objeto             Boolean resultado = apagar.NewLine                      Environment. EventArgs e)         {             // Cria objeto do modelo usando o construtor overload             Funcionario funcionario = new Funcionario(Convert.               // Altera Objeto             Boolean resultado = alterar. textBox3.             }         }           // Deleta registro         private void button5_Click(object sender.             }         } 156     } .NewLine +                     apagar.Show("Erro ao inserir dados:" + Environment.NewLine                      Environment.deletaFuncionario(funcionario). Convert.                 button2. textBox3.getErro()).Show("Dados apagados com sucesso").

156 157     } }   Sobre estes anúncios (https://wordpress.com. .90 Crie um website ou blog gratuito no WordPress.com/about­these­ads/) R$ 120.