Database – Sequence e Identity – DbProviderFactory – Oracle – IBM DB2 – Microsoft SQL Server – C#

Publicado: 25 de setembro de 2014 em C#

Uma Sequence é um objeto de banco de dados encontrado nos bancos de dados Oracle e IBM DB2, que permite a geração automática de valores, tais como números de identificação. Sequências são ideais para a tarefa de gerar valores de chaves únicas. Os aplicativos podem usar sequências para evitar possíveis problemas de simultaneidade e de desempenho resultantes de valores de coluna. A vantagem que tem sobre as  sequências de números criados fora do banco de dados é que o servidor de banco de dados mantém o registro dos números gerados e nenhum tipo de acidente no banco de dados causará números duplicados.

Sequence - Identity - C#

Sequence – Identity – C#

Identity é encontrado no banco de dados Micosoft SQL Server e é muito similar ao Sequence e possui o mesmo objetivo que é de criar números sequenciais, porem não é um objeto do banco de dados e sim uma propriedade de uma coluna pertencente a uma tabela. Quando você insere um valor em uma tabela que possui uma propriedade Identity você deve excluir o campo referente a esta coluna da clausula SQL, sendo assim o MSSQL Server é o único banco de dados que permite que a quantidade de colunas na linha Values da instrução Insert seja diferente da quantidade de colunas na tabela do banco de dados.

sequence-3-sql-server

MSSQL – Identity – Propriedades

Para saber mais detalhes sobre os recursos dos objetos Sequences ou da propriedade Identity recomendamos que você utilize os links oficiais de cada banco de dados:

Oracle: Sequence
IBM DB2: Sequence
MSSQL Server: Identity

OBS: À partir da versão 2012 do MSSQL a microsoft também decidiu adotar Sequences para criar números auto incrementos, pois elas possuem vantagens em relação ao Identitiy que até nas versões atuais apresentam alguns problemas como pular a numeração automática inexplicavelmente.

Sequences MSSQLhttps://msdn.microsoft.com/pt-br/library/ff878091(v=sql.120).aspx

Algo extremamente útil sobre Sequence ou Identity

Utilizar um objeto ou uma propriedade auto incremento é o método correto para criar IDs automáticos no banco de dados, nunca utilize uma Trigger para executar este procedimento, pois deste modo você esta reduzindo sensivelmente a performance do banco de dados, visto que você precisa de acessos e objetos extras para executar a mesma função.

Para valores de Sequence ou Identity que são utilizados fora do banco de dados, por exemplo, números de sequência usados ​​para identificadores externos (números de cheques bancários ou outros), se o banco de dados é recuperado para um ponto no tempo antes de uma falha, então isso poderia causar a geração de valores duplicados para algumas sequências. Para evitar possíveis valores duplicados, bancos de dados que usam valores de sequência fora do banco de dados não deve ser recuperado para um ponto anterior no tempo.

Visual Studio

Para criar a conexão com os três bancos de dados você precisa configurar seu projeto com os Providers externos de cada um dos fabricantes, você encontra um tutorial de como criar as conexões em nossas categorias SQL e C# e depois você pode criar um design com 3 componentes RadioButton, 1 componentes Labels, um componente Button e um componente DataGridView use a figura abaixo para referencia:

Visual Studio - design

Visual Studio – design

Conectando ao Oracle, DB2 e MSSQL

Para efetuar a conexão com os três bancos de dados utilizamos a classe DbProviderFactory e as classes comuns para conexão e manipulação de dados contidas no namespace chamado System.Data.Common, que são classes genéricas equivalentes as classes no qual já utilizamos de um modo nativo para cada provedor de banco de dados nos exemplos anteriores, as classes comuns são:  DbConnection, DbCommand e DbDataReader.

DbProviderFactory

Representa um conjunto de métodos para criar instâncias de implementação de classes de provedor de dados. O processo de obter DbProviderFactory envolve passar informações sobre um provedor de dados para a classe DbProviderFactories.  Com base nessas informações, o método GetFactory cria uma fábrica de provedor fortemente tipada.

As classes OracleClientFactory, OdbcFactory e OleDbFactory do .NET Framework também oferecem funcionalidade semelhante.

Atente-se que qualquer cliente Oracle ADO.NET das classes contidas no namespace System.Data.OracleClient é um provedor obsoleto, veja comentário e link para consulta no código fonte.

Exemplo:

Neste exemplo utilizamos uma Sequence para os bancos de dados Oracle e IBM DB2 e uma propriedade Identity para o banco de dados MSSQL para criar identificadores automáticos para a coluna chave de uma tabela.

SQL

Oracle

-- Cria sequencia
CREATE SEQUENCE Sequencia_seq
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

-- Cria tabela
CREATE TABLE SEQUENCIA (
   Identificador   NUMBER(10),
   Nome            VARCHAR(30),
   Sobrenome       VARCHAR(70),
   Cargo           VARCHAR(30),
   Salario         Decimal(9,2));

 -- Testa sequencia
insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,'Teste','Teste Sobrenome','Programador',2234.56);

-- verifica resultado
SELECT * FROM SEQUENCIA

IBM DB2

-- Cria Sequencia
CREATE SEQUENCE Sequencia_seq
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

-- Cria tabela
CREATE TABLE SEQUENCIA (
   Identificador   INTEGER,
   Nome            VARCHAR(30),
   Sobrenome       VARCHAR(70),
   Cargo           VARCHAR(30),
   Salario         Decimal(9,2));

 -- Testa Sequencia
insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,'Teste','Teste Sobrenome','Programador',2234.56);

-- Verifica resultado
Select * from SEQUENCIA;

MSSQL

-- Cria tabela / Identity
CREATE TABLE SEQUENCIA(
	Identificador int IDENTITY(1,1) NOT NULL,
	Nome          nvarchar(30) NULL,
	Sobrenome     nvarchar(70) NULL,
	Cargo         nvarchar(30) NULL,
	Salario       decimal(9, 2) NULL);

-- Testa identação
insert into SEQUENCIA VALUES ('Teste','Teste Sobrenome','Programador',2234.56);

-- Verifica tabela
select * from SEQUENCIA;

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;    // ADO.NET
using Oracle.DataAccess.Client; // ODAC 12c
using IBM.Data.DB2;             // IBM Data Server Provider
using System.Data.Common;       // ADO Comum

namespace Acesso
{
    public partial class Dados : Form
    {
        // Conexão Unica (Factory)
        private static DbConnection connUnica = null;
        private static DbProviderFactory factory;

        DataTable dataTable;

        string sql;
        static string bancodedados;

        public Dados()
        {
            InitializeComponent();
        }

        // ************** Sobre Conexões - ADO.NET **************
        //
        // A Microsoft disponibiliza por exemplo, o System.Data.OracleClient
        // porem se tornou obsoleto e ainda é suportado somente
        // a nível de compatibilidade com versões anteriores do Framework.
        // A Microsoft recomenda utilizar o driver de cada fornecedor:
        //
        // veja: http://msdn.microsoft.com/en-us/library/77d8yct7.aspx
        //
        // Você pode utilizar a classe DbProviderFactory
        // para criar um único datasource para todos os bancos de dados:
        //
        // http://msdn.microsoft.com/pt-br/library/system.data.common.dbproviderfactory(v=vs.110).aspx
        //
        // No entanto diferentemente da linguagem JAVA (JDBC) o ADO.NET não suporta
        // alguns recursos do Oracle e IBM DB2.
        //
        // *** Factory ***
        //
        // Utilizando conexões únicas de cada provedor de banco de dados
        // através de um Factory, permite que você utilize um único set de instruções
        // para todos os bancos de dados.
        //
        // Atente-se que se utilizar instruções únicas, em alguns casos poderá encontrar
        // alguns erros de compatibilidade ou criar certas limitações a outros bancos.
        // O ADO.NET é desenvolvido para o MSSQL Server e está sujeito
        // a algumas limitações quando utilizar alguns tipos de campos,
        // conceitos de conexão e acesso a dados de outros bancos de dados.
        //
        // Sistemas de grande porte possuem um Dicionário de dados
        // para se prevenir destas situações.
        //
        // Neste exemplos utilizamos DbProviderFactory e a Classe comum pertencendte ao
        // namespaces: System.Data.Common para criar um set de instruções comuns para todos os bancos de dados.


        // *** String de Conexão ***
        // Devido ao conceito de Database/User e TNS Names do Oracle
        // precisamos de uma função Override para outros bancos de dados com conceito de Database comum.
        // caso deseje montar a String de conexão utilizando parâmetros em um método.
        public void conexaoUnica(string Username, string Password, string Datasource)
        {

            string connectionString;

            if (bancodedados == "oracle")
            {
                try
                {
                    // String de Conexao
                    connectionString =

                    // Usuario
                    "User Id=" + Username +

                    // Senha
                    ";Password=" + Password +

                    // TNSnames
                    ";Data Source=" + Datasource;

                    // ODAC 12c
                    factory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client");

                    connUnica = factory.CreateConnection();
                    connUnica.ConnectionString = connectionString;
                    connUnica.Open();
                }

                 catch (Exception ex)
                {
                     // Mostra menssagem de erro
                     MessageBox.Show(ex.ToString());
                }
            }
        }

        // Metodo Override para conexão IBM DB2 e MSSQL

        public void conexaoUnica(string Server, string Database,
                                    string Username, string Password, string Timeout)
        {

            string connectionString;

            if (bancodedados == "db2")
            {
                try
                {
                    // String de Conexao
                    connectionString =

                    // Servidor
                    "Server=" + Server +

                    // Banco de dados
                    ";Database=" + Database +

                    // Usuario
                    ";UID=" + Username +

                    // Senha
                    ";PWD=" + Password +

                    // TNSnames
                    ";Connect Timeout=" + Timeout;

                    // IBM DATA Server Provider
                    factory = DbProviderFactories.GetFactory("IBM.Data.DB2");

                    connUnica = factory.CreateConnection();
                    connUnica.ConnectionString = connectionString;
                    connUnica.Open();
                }

                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());
                }
            }

            if (bancodedados == "mssql")
            {
                try
                {
                    // String de Conexao
                    connectionString =

                    // Servidor
                    "Server=" + Server +

                    // Banco de dados
                    ";Database=" + Database +

                    // Usuario
                    ";UID=" + Username +

                    // Senha
                    ";PWD=" + Password +

                    // TNSnames
                    ";Connect Timeout=" + Timeout;

                    // ADO NET Nativo - MSSQL Server
                    factory = DbProviderFactories.GetFactory("System.Data.SqlClient");

                    connUnica = factory.CreateConnection();
                    connUnica.ConnectionString = connectionString;
                    connUnica.Open();
                }

                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());
                }
            }

        }     

        // Retorna um set de dados
         public  DataTable retornaTabela(string sql, string inserir)
         {
             // Cria instância da classe
             Dados acesso = new Dados();

             // Define banco de dados
             // Efetua Login no banco de dados

             if (bancodedados == "oracle")
             {
                 acesso.conexaoUnica("user", "p@55w0rd", "XE");
             }

             if (bancodedados == "db2")
             {
                 acesso.conexaoUnica("localhost", "DEVA", "user", "p@55w0rd", "40");
             }

             if (bancodedados == "mssql")
             {
                 acesso.conexaoUnica("localhost", "DevAberto", "user", "p@55w0rd", "");
             }

                 // Define a instrução SQL e a conexão
                 DbCommand cmdUnicoInsere = factory.CreateCommand();
                 cmdUnicoInsere.Connection = connUnica; ;
                 cmdUnicoInsere.CommandText = inserir;
                 cmdUnicoInsere.ExecuteNonQuery();

                 DbCommand cmdUnico = factory.CreateCommand();
                 cmdUnico.Connection = connUnica; ;
                 cmdUnico.CommandText = sql;

                 // Cria comandos para retornar dados para exibir a grade de dados

                 DbDataReader uReader = cmdUnico.ExecuteReader();
                 dataTable = new DataTable();
                 dataTable.Load(uReader);

             return  dataTable;

         }

        // configura programa
        private void Form1_Shown(object sender, EventArgs e)
        {
            radioButton1.Checked = true;
            bancodedados = "oracle";
        }

        // Conecta dados
        private void button1_Click(object sender, EventArgs e)
        {
            // Declara variavel SQL
            string insere;

            // Cria instância da classe
            Dados dados = new Dados();

            // Seleciona dados da tabela
            sql = "SELECT * FROM SEQUENCIA ORDER BY 1";

            // DB2 e Oracle utilizam sequence
            // SQL Server utiliza o Identity
            // Como é um objeto atrelado ao campo
            // Necessita ser suprimido da clausula SQL

            if (bancodedados != "mssql")
            {
                insere = "insert into SEQUENCIA VALUES (Sequencia_seq.NEXTVAL ,\'Teste\',\'Teste Sobrenome\',\'Programador\',2234.56)";
            }
            else
            {
                insere = "insert into SEQUENCIA VALUES (\'Teste\',\'Teste Sobrenome\',\'Programador\',2234.56)";
            }

            // Alimenta grid de dados
            dataGridView1.DataSource = dados.retornaTabela(sql, insere);

        }

        // Seleciona banco de dados Oracle
        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                bancodedados = "oracle";
            }

        }

        // Seleciona banco de dados IBM DB2
        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton2.Checked)
            {
                bancodedados = "db2";
            }
        }

        // Seleciona banco de dados MSSQL Server
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton3.Checked)
            {
                bancodedados = "mssql";
            }
        }
    }
}

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s