Database – Table Fields – Manipulando Campos – OracleDataReader – DB2DataReader – SqlDataReader – Oracle – DB2 – MSSQL – C#

Publicado: 27 de maio de 2014 em C#

Na linguagem de programação C# você pode usar o objeto SqlDataReader através de um driver ADO.NET para retornar campos de um set de dados no qual poderá ser manipulado de modo que você possa escolher qualquer um dos campos da tabela contida em seu Dataset.

Vale ressaltar que no programa abaixo não utilizamos um método genérico para manipular os dados e sim um driver especifico de cada fornecedor de banco de dados, optamos por este método pois somente ele possibilita utilizar features avançadas de cada um de seus respectivos fornecedores(Oracle e IBM)

Database - Table Fields

Database – Table Fields

Ai esta uma grande diferença entre Java e C#, você pode analisar o código em Java (mesmo programa) que nos permite utilizar os drivers JDBC nativos de cada fornecedor utilizando um ResultSet comum. O C# não possui o objeto ResultSet mas é possível cria-lo à partir de interfaces abstratas  chamadas IDataReader, IDataRecord, IEnumerable e IDisposable.

Um ResultSet é muito similar ao DataReader, porem permite que você navegue por qualquer parte do set de resultado sem precisar criar outra conexão, visto que os drivers Oracle e IBM, já utilizam esta arquitetura, veja comentários no código abaixo e teste como funciona na pratica. A Microsoft disponibiliza um exemplo simples de como implementar um ResultSet, mas para uso em escala empresarial, você precisa aprimorar o exemplo básico disponível no MSDN.

ResultSet – C#: http://msdn.microsoft.com/en-us/library/ff878121.aspx

Para utilizar uma linha de dados por coluna em C# nos bancos de dados Oracle, DB2 e MSSQL, siga os seguintes passos:

1 – Crie a tabela de exemplo e insira as linhas de dados com o script para o seu banco de dados que você encontra logo abaixo. No Visual Studio crie um design como na figura abaixo, utilizando 7 Labels, 6 TextBox, 2 Panel e um Button.

Design

Design

Exemplo:

Este programa foi escrito para retornar uma linha de dados em uma tabela e exibir os campos em caixas de textos.

SQL

Oracle

create table Funcionarios
(     

    ID_Funcionario  NUMBER(5),
    Nome            VARCHAR2(30),
    Sobrenome       VARCHAR2(70),
    Cargo           VARCHAR2(30),
    Salario         NUMBER(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

DB2

create table Funcionarios
(     

    ID_Funcionario  INTEGER,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         NUMERIC(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

Mssql

create table Funcionarios
(     

    ID_Funcionario  Int,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         Decimal(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

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;
using Oracle.DataAccess.Client;
using IBM.Data.DB2;

namespace DACampos
{

    public partial class Campos : Form
    {
        // Declara componentes de conexão
        private static OracleConnection connORA; // ODAC 12c
        private static DB2Connection connDB2;   // IBM Data Server Provider
        private static SqlConnection connMSSQL; // ADO .NET

        // ************** 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.
        //
        // Veja este mesmo programa utilizando o DriverManager equivalente ao factory para java
        // e veja comentários extras no código apontando diferenças de conceitos.

        // Declara variável do banco de dados
        private static string DBconexao;

        public Campos()
        {
            InitializeComponent();
        }

        // Cria método de conexão
        public void conectarDB(string banco)
        {
            DBconexao = banco;

            if (banco == "oracle")
            {

                try
                {
                    // String de Conexao
                    string connectionString =

                    // Usuario
                    "User Id=user"+

                    // Senha
                    ";Password=p@55w0rd" +

                    // TNSnames
                    ";Data Source=XE";

                    //Conecta ao datasource usando a conexão Oracle
                    connORA = new OracleConnection(connectionString);

                    //Abre a conexão com o banco de dados
                    connORA.Open();
                }
                    // Retorna erro
                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());
                }
            }

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

                        // Servidor
                        "Server=localhost" + 

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

                        // Usuario
                        ";UID=db2admin" + 

                        // Senha
                        ";PWD=p@55w0rd" + 

                        // Timeout
                        ";Connect Timeout=40";

                    //Conecta ao datasource usando a conexão DB2
                    connDB2 = new DB2Connection(connectionString);

                    //Abre a conexão com o banco de dados
                    connDB2.Open();

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

                }

            }

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

                        // Servidor
                        "Data Source=localhost" + 

                        // Banco de dados
                        ";Initial Catalog=DevAberto" +

                        // Usuario
                        ";User ID =user" + 

                        // Senha
                        ";Password=p@55w0rd" +

                        // Timeout
                        ";Connect Timeout=40";

                    //Conecta ao datasource usando a conexão Padrão
                    connMSSQL = new SqlConnection(connectionString);

                    //Abre a conexão com o banco de dados
                    connMSSQL.Open();

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

                }

            }

        }

        // Evento de clique do botão
        private void button1_Click(object sender, EventArgs e)
        {
            // Cria instancia do objeto
            Campos campos = new Campos();

            // A variável abaixo:
            // Define banco de dados
            // oracle = Oracle Database
            // db2    = IBM DB2 Database
            // mssql  = Microsoft SQL Server
            campos.conectarDB("oracle");

            // Define instrução SQL
            string sql = "Select * From FUNCIONARIOS Where  ID_FUNCIONARIO = " + textBox6.Text;

            // Usando um procedimento de conexão para da driver especifico

            // Oracle - ODAC
            if (DBconexao == "oracle")
            {
                label1.Text = "Database - fields : " + DBconexao;

                OracleCommand oracmd = new OracleCommand(sql, connORA);
                OracleDataReader orareader = oracmd.ExecuteReader();

                if (orareader.HasRows)
                {
                    while (orareader.Read())
                    {
                        textBox1.Text = Convert.ToString(orareader.GetInt32(0));
                        textBox2.Text = orareader.GetString(1);
                        textBox3.Text = orareader.GetString(2);
                        textBox4.Text = orareader.GetString(3);
                        textBox5.Text = Convert.ToString(orareader.GetDecimal(4));
                    }
                }

            }

            // IBM Data Server Provider
            if (DBconexao == "db2")
            {
                label1.Text = "Database - fields : " + DBconexao;

                DB2Command db2cmd = new DB2Command(sql);
                db2cmd.Connection = connDB2;
                DB2DataReader db2reader = db2cmd.ExecuteReader();

                if (db2reader.HasRows)
                {
                    while(db2reader.Read())
                    {
                        textBox1.Text = Convert.ToString(db2reader.GetInt32(0));
                        textBox2.Text = db2reader.GetString(1);
                        textBox3.Text = db2reader.GetString(2);
                        textBox4.Text = db2reader.GetString(3);
                        textBox5.Text = Convert.ToString(db2reader.GetDecimal(4));
                    }
                }

            }

            // microsoft ADO.NET
           if (DBconexao == "mssql")
           {
               label1.Text = "Database - fields : " + DBconexao;

               SqlCommand mssqlcmd = new SqlCommand(sql);
               mssqlcmd.Connection = connMSSQL;
               SqlDataReader mssqlreader = mssqlcmd.ExecuteReader();

               if (mssqlreader.HasRows)
               {
                   while (mssqlreader.Read())
                   {
                       textBox1.Text = Convert.ToString(mssqlreader.GetInt32(0));
                       textBox2.Text = mssqlreader.GetString(1);
                       textBox3.Text = mssqlreader.GetString(2);
                       textBox4.Text = mssqlreader.GetString(3);
                       textBox5.Text = Convert.ToString(mssqlreader.GetDecimal(4));
                   }

                 // Aqui nota-se uma diferença entre os drivers
                 // Tente utilizar a conexão sem fechar o DataReader utilizando ADO.NET nativo (MSSQL)</pre>
                 // Tente fazer o mesmo com ODAC 12c e com o IBM DB2 Data Server Provider

                 // ADO.NET É necessário fechar o DataReader antes de executar um sqlcommand.
                 // ODAC não é necessário
                 // IBM DATA Server não é necessário
                 // 
                 // Aplica-se a qualquer DataReader ADO.NET
                 //
                 // Enquanto o DataReader está em uso, 
                 // o Connection associado está ocupado servindo o DataReader.
                 // Enquanto estiver neste estado, 
                 // nenhuma outra operação pode ser realizada sobre o Connection além de fechá-lo.
                 // Os drivers da Oracle e IBM não possuem esta arquitetura e não ocupam a conexão
                 // permitindo ainda múltiplas operações sobre ela.

               }
           }
        }
    }
}

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 )

Foto do Google+

Você está comentando utilizando sua conta Google+. 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 )

Conectando a %s