Arquivo da categoria ‘C#’

ASP.NET – Responses – Status Code – C#

Publicado: 3 de dezembro de 2014 em C#

A cada solicitação do protocolo HTTP o servidor indica uma resposta provisória, consistindo somente da linha de status e cabeçalhos opcionaisencerrado por uma linha vazia. As respostas podem conter por exemplo erros de HTTP que são enviados para o navegador da Web pelo servidor se um problema for encontrado durante a tentativa de exibir uma página da Web. Se a página da Web não for exibida, o servidor exibirá a página de erro real enviada pelo site ou uma mensagem de erro amigável.

As vezes é útil criar uma pagina customizada para as paginas geradas automaticamente pelo servidor pois o mesmo pode mostrar nestas paginas informações que não queremos que o usuário remoto tenha conhecimento, além das boas praticas e uma mensagem esteticamente amigável, ainda temos entre os motivos, a segurança.

Para uma lista completa de todos os códigos de resposta enviados pelo servidor utilize o link abaixo:

Response Status Code: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Customizando uma Página de Erro

11- Crie uma aplicação do tipo ASP.NET Web Application com o modelo C# Empty e chame seu projeto de DAWebStatusCode, crie uma nova pagina html chamada default. Copie o código para a pagina e rode o programa:

Default.html

Default.html

2 – Clique no link “ASP.NET” para que você obtenha a pagina de erro com a resposta gerada pelo servidor:

ASP.NET - Erro

ASP.NET – Erro

3 – Para substituir a pagina automática por uma pagina mais amigável precisamos capturar a resposta do servidor e exibir uma pagina com informações customizadas, entretanto não queremos que o usuário tenha acesso a esta pagina via o navegador, então precisamos criar uma pagina chamada de 404.html e alterar o web.config, redirecionando a resposta 404 para a pagina 404.html. Crie a pagina 404.html e altere o arquivo web.config utilizando os respectivos códigos abaixo, em seguida rode a aplicação:

Default.html

Default.html

4 – Clique novamente na opção “ASP.NET” e sua pagina customizada será exibida sem que nenhuma informação do servidor e de sua aplicação seja apresentada para o usuário remoto:

Erro - Customizado

Erro – Customizado

Entretanto ASP.NET possui algumas configurações diferenciadas, por exemplo no arquivo Web.Config, toda a configuração para paginas de erro customizadas em ASP.NET necessitam estar dentro da tag <system.web> na tag  <customErrors> enquanto as configurações para erros HTTP necessitam estar na tag <configuration> na tag <system.webserver>.

ASP.NET Custom Error: http://msdn.microsoft.com/pt-br/library/h0hfz6fc(v=vs.85).aspx

System.webServer: http://msdn.microsoft.com/pt-br/library/bb763179(v=vs.100).aspx

Exemplo:

Neste exemplo utilizamos a resposta do servidor para substituir a mensagem de erro 404 por uma mensagem exibida em uma pagina customizada. Como estamos utilizando uma aplicação que utiliza paginas html em um modelo vazio, a configuração de erro que possui efeito é a contida nos elementos system.webServer.

HTML

default.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Desenvolvimento Aberto - HTTP Respostas</title>
    <style>
        #header {
            background-color: Black;
            color: white;
            text-align: center;
            padding: 5px;
        }

        #nav {
            line-height: 30px;
            background-color: #eeeeee;
            height: 400px;
            width: 100px;
            float: left;
            padding: 5px;
        }

        #section {
            width: 450px;
            float: left;
            padding: 10px;
        }

        #footer {
            background-color: Black;
            color: white;
            clear: both;
            text-align: center;
            padding: 5px;
        }
    </style>

</head>
<body>
    <div id="header">
        <h1>Desenvolvimento Aberto</h1>
    </div>

    <div id="nav">

        <!-- HTTP Response:

         Este link referencia uma página que não existe,
         deste modo o servidor nos enviará um erro 404  -->
        <p>
            <a href='nao-existe.html'>ASP.NET</a>
        </p>
        <p>Web Forms</p>
        <p>MVC</p>
        <p>C#</p>

    </div>

    <div id="section">
        <h2>Desenvolvimento Aberto</h2>
        <p>
            Desenvolvimento Aberto é uma organização voltada para o
            aprendizado e discussão de técnicas de desenvolvimento focado em
            algumas linguagens de programação sendo parcialmente/totalmente
            abertas ou com licenças gratuitas para desenvolvedores de cada uma de
            suas respectivas marcas registradas.
        </p>
        <p>
            Desenvolvimento Aberto foi escrito e desenvolve utilizando
            ferramentas gratuitas disponibilizadas pelas melhores empresas de
            software da atualidade, incluindo a própria hospedagem e design deste
            site, sendo assim, também proporciona conteúdo gratuito, isso quer
            dizer que você não paga nada para aprender e utilizar as tecnologias
            de ponta que podem ser manuseadas através das linguagens de
            programação mais requisitadas pelas empresas no mercado atual.
        </p>
    </div>

    <div id="footer">
        Desenvolvimento Aberto ©
        desevolvimento.aberto@live.com
    </div>

</body>
</html>

404.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <h1>Desenvolvimento Aberto</h1>
    <h3>Desculpe! Não encontramos a página solicitada no servidor</h3>
    <p>Erro: HTTP 404. </p>
</body>
</html>

web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />

    <customErrors defaultRedirect="GenericError.htm"
                 mode="On">
      <error statusCode="404"
             redirect="404.html"/>
    </customErrors>
  </system.web>

  <system.webServer>
    <httpErrors errorMode="Custom">
      <remove statusCode="404"/>
      <error statusCode="404" path="404.html" responseMode="ExecuteURL"/>
    </httpErrors>
  </system.webServer>
  
</configuration>

Sabendo que a tecnologia Active Server Pages proporcionada pelo servidor de aplicação nos possibilita criar aplicações web dinâmicas utilizando .NET, vamos então criar um motor básico que utiliza o principio usado por quase todas as aplicações web para o mundo corporativo, ou seja manipulação de dados.

Em aplicações Enterprise os dados na grande maioria das vezes é manipulado através de um servidor de banco de dados relacional, entretanto neste primeiro exemplo vamos utilizar um objeto C# que possibilita a criação de listas para manipular os dados, ressaltando o que realmente nos interessa neste momento é apenas o esqueleto de uma simples aplicação que mostra, adiciona, edita e deleta dados através de uma interface com o usuário.

Criando uma Aplicação Web C#

1- Crie uma aplicação do tipo ASP.NET Web Application com o modelo C# Empty e chame seu projeto de DAWebApp, crie uma nova pagina WebForms chamada default. Crie também uma classe chamada Menssagem. Utilize o código abaixo para cada respectivo arquivo e compile a aplicação:

Default - Mostra grade de dados

Default – Mostra grade de dados

2 – Para adicionar dados utilizamos a pagina adados.aspx (add),  que contem os componentes de acordo com os arquivos abaixo:

adados.aspx - adiciona dados

adados.aspx – adiciona dados

3 – Para editar os dados utilizamos a pagina udados.aspx (update) que contem os componentes de acordo com os arquivos abaixo:

udados.aspx - editar dados

udados.aspx – editar dados

4 – Para remover os dados utilizamos a pagina ddados.aspx (delete) cujo código esta disponível também logo abaixo:

ddados - deleta dados

ddados – deleta dados

Exemplo:

Neste exemplo utilizamos o conceito básico de manipulação de objetos utilizando objetos de lista, que fazem parte do framework de coleções do C#.

Este modelo de aplicação utilizando lista armazena o objeto em uma sessão do servidor de aplicação, tente abrir um outro navegador como o Firefox por exemplo, enquanto roda sua aplicação no Internet Explorer, alimente dados na lista e você irá constatar que devido o uso da sessão cada navegador possui uma lista com dados distintos, já que cada um utiliza uma sessão diferente.

C#

Objeto – Menssagem.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace DaWebApp
{
    public class Menssagem
    {
        // Declara atributos
        private int id;
        private string nome;
        private string menssagem;

        // Construtor padrão
        public Menssagem() { }

        // Construtor Overload
        public Menssagem(int id, string nome, string menssagem)
        {
            // Inicializa valores;
            this.id = id;
            this.nome = nome;
            this.menssagem = menssagem;
        }

        // Propriedades
        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }

        public string Nome
        {
            get
            {
                return nome;
            }

            set
            {
                nome = value;
            }
        }

        public string Msg
        {
            get
            {
                return menssagem;
            }
            set
            {
                menssagem = value;
            }
        }
    }
}

default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="DaWebApp._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>

default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DaWebApp
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["registros"] == null)
            {
                // Cria lista para o objeto
                List<Menssagem> msg = new List<Menssagem>();

                // Adiciona dados ao objeto
                msg.Add(new Menssagem(1, "Ricardo", "Olá Pessoal"));
                msg.Add(new Menssagem(2, "Mantovani", "Bem-vindos ao Desenvolvimento Aberto," +
                                      " adicione, altere e exclua dados desta tabela"));

                // Adiciona objeto a sessão
                Session["registros"] = msg;
            }

            // Cria pagina no método HTTP GET
            if (Request.HttpMethod.Equals("GET"))
            {
                doGet();
            }
        }

        private void doGet()
        {
            // Cria estilo CSS
            Response.Write("<head>");
            Response.Write("<style>");
            Response.Write("td, th {");
            Response.Write("border: none;");
            Response.Write("background-color: #dddddd;");
            Response.Write("padding: 5px;");
            Response.Write("width: 200px; }");
            Response.Write("</style>");
            Response.Write("</head>");

            // Titulo da pagina
            Response.Write("<h1>Desenvolvimento Aberto - Listas </h1>");

            // Cria tabela
            Response.Write("<table>");
            Response.Write("<tr>");
            Response.Write("<th>ID:</th>");
            Response.Write("<th>Nome:</th>");
            Response.Write("<th>Comentário:</th>");
            Response.Write("<th>Ação:</th>");
            Response.Write("</tr>");

            // Recupera objeto da sessão
            List<Menssagem> registros = (List<Menssagem>)Session["registros"];

            // Itera objeto
            foreach (Menssagem reg in registros)
            {
                Response.Write("<tr>");
                Response.Write("<td>" + reg.Id + "</td>");
                Response.Write("<td>" + reg.Nome + "</td>");
                Response.Write("<td>" + reg.Msg + "</td>");

                // Link de edição
                Response.Write("<td><center>");
                Response.Write("<a href='udados.aspx?identificador=" + reg.Id + "'>Editar</a> | ");
                Response.Write("<a href='ddados.aspx?identificador=" + reg.Id + "'>Apagar</a>");
                Response.Write("</center></td>");
                Response.Write("</tr>");
            }

            Response.Write("</table>");

            // Define link para formulario de adicionar dados
            Response.Write("<P> <a href='adados.aspx'>Adicione um comentário</a> </p>");
        }
    }
}

adados.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="adados.aspx.cs" Inherits="DaWebApp.adados" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <h1>Desenvolvimento Aberto - Adiciona Menssagem</h1>
    <form id="form1" runat="server">
    <div>

        <asp:Label ID="Label2" runat="server" Text="Id:entificador  "></asp:Label>
        <br />
        <asp:TextBox ID="TextBox1" runat="server" Width="135px"></asp:TextBox>
        <br />

        <asp:Label ID="Label1" runat="server" Text="Nome:"></asp:Label>
        <br />
        <asp:TextBox ID="TextBox2" runat="server" Width="229px"></asp:TextBox>
        <br />
        <br />
        <asp:TextBox ID="TextBox3" runat="server" Height="118px" TextMode="MultiLine" Width="269px"></asp:TextBox>

        <br />
        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Adicionar" Width="274px" />

    </div>
    </form>
</body>
</html>

adados.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DaWebApp
{
    public partial class adados : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            // recupera parametro
            string parametro = Request.QueryString["identificador"];

            // Recupera objeto da sessão
            List<Menssagem> registros = (List<Menssagem>)Session["registros"];

            // Adiciona registros
            registros.Add(new Menssagem(Convert.ToInt32(TextBox1.Text), TextBox2.Text, TextBox3.Text));
            Response.Redirect("default.aspx");
        }
    }
}

udados.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="udados.aspx.cs" Inherits="DaWebApp.udados" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <h1>Desenvolvimento Aberto - Altera Dados</h1>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Identificador:"></asp:Label>
        <br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        Nome:<br />
        <asp:TextBox ID="TextBox2" runat="server" Width="194px"></asp:TextBox>
        <br />
        <br />
        <asp:Label ID="Label2" runat="server" Text="Menssagem:"></asp:Label>
        <br />
        <asp:TextBox ID="TextBox3" runat="server" Height="122px" TextMode="MultiLine" Width="209px"></asp:TextBox>

        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Alterar" Width="112px" />

    </div>
    </form>
</body>
</html>

udados.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DaWebApp
{
    public partial class udados : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Verifica se a resposta não é um postback
            if (!IsPostBack)
            {
                // Recupera parametro
                string parametro = Request.QueryString["identificador"];

                // Alinha ID com indice da lista
                int id = Convert.ToInt32(parametro);
                id -= 1;

                // Recupera objeto da sessão
                List<Menssagem> registros = (List<Menssagem>)Session["registros"];

                // Exibe objeto
                if (Session["registros"] != null)
                {
                    TextBox1.Text = Convert.ToString(registros[id].Id);
                    TextBox2.Text = registros[id].Nome;
                    TextBox3.Text = registros[id].Msg;
                }
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            // Recupera parametro
            string parametro = Request.QueryString["identificador"];

            // Alinha ID com o indice
            int id = Convert.ToInt32(parametro);
            id -= 1;

            // Recupera obeto da sessão
            List<Menssagem> registros = (List<Menssagem>)Session["registros"];

            // Altera propriedades da  lista
            registros[id].Id = Convert.ToInt32(TextBox1.Text);
            registros[id].Nome = TextBox2.Text;
            registros[id].Msg = TextBox3.Text;

            // Redireciona pagina
            Response.Redirect("default.aspx");

        }
    }
}

ddados.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ddados.aspx.cs" Inherits="DaWebApp.ddados" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>

ddados.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DaWebApp
{
    public partial class ddados : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Recupera parametro
            string parametro = Request.QueryString["identificador"];

            // Alinha ID com indice da lista
            int id = Convert.ToInt32(parametro);
            id -= 1;

            // Recupera objeto da sessão
            List<Menssagem> registros = (List<Menssagem>)Session["registros"];

            // Remove registro da lista
            registros.RemoveAt(id);

            // Alinha indice com ID
            id += 1;

            // Define Menssagem ao usuario
            Response.Write("<h1>Desenvolvimento Aberto</h1>");
            Response.Write("Registro: ID:" + id + " removido com sucesso <br>");
            Response.Write("<a href='default.aspx'>Voltar</a>");

        }
    }
}

ASP.NET – Session Scope – C#

Publicado: 1 de dezembro de 2014 em C#

O escopo de um objeto descreve a disponibilidade de sua abrangência e quem tem acesso a ele. Por exemplo, se um objeto é definido para ter alcance a uma pagina página, então ele está disponível apenas durante a duração da solicitação atual nessa página antes de ser destruído. Neste caso, somente a página atual tem acesso a esses dados, e ninguém mais pode lê-lo. No outro extremo da escala, se um objeto tem espaço de aplicação, em seguida, qualquer página pode utilizar os dados porque ele estará disponível durante toda a aplicação.

Um objeto da sessão é mantido para cada usuário que solicita uma página ou documento de um aplicativo ASP.NET. Variáveis armazenadas no objeto Session não são descartadas quando o usuário move a partir de uma página para outra no pedido; em vez disso, essas variáveis persistem enquanto o usuário está acessando páginas em seu aplicativo.

Page Class

Representa um arquivo .aspx, também conhecida como uma página Web Forms, solicitada a partir de um servidor que hospeda um aplicativo Web ASP.NET.

Page.Session Property

Obtém o objeto Session atual fornecido pelo ASP.NET.

Utilizando Variáveis de Sessão

1- Crie uma aplicação do tipo ASP.NET Web Application com o modelo C# Empty e chame seu projeto de AspNetSessionScope, crie uma nova pagina WebForms chamada default. Crie também uma classe chamada Cor. Utilize o código abaixo para cada respectivo arquivo e compile a aplicação:

Página Inicial

Página Inicial

2 – O evento Page_Load cria uma instancia do objeto da classe Cor e modifica o valor da cor do elemento DIV da pagina aspx de acordo com o valor inicializado pelo construtor do objeto Cor.

  • Abra uma nova aba do navegador e copie e cole a url da pagina, você deve obter duas paginas com o texto vermelho.
  • Volte na primeira aba e inclua o parâmetro cor no final da url e pressione enter: ?Cor=blue
Alimenta Paramêtro

Alimenta Parâmetro

3 – A cor foi modificada e o valor do parâmetro foi armazenado em uma variável de sessão que responsável por alterar a cor do elemento DIV nas seguintes condições:

  • Se existir um parâmetro ou se houver uma variável de cor atrelada a sessão.
  • Selecione a outra aba e a cor do elemento DIV ainda permanece vermelha, atualize a pagina e pronto a pagina mudará a cor do elemento DIV de acordo com a cor armazenada na sessão.
  • Você pode mudar a cor do parâmetro na primeira aba e atualizar a pagina na segunda aba quantas vezes quiser, pode ainda abrir outras abas e a cor do elemento DIV sempre utilizara a cor armazenada na sessão da aplicação.
  • Abra outro navegador, cole a url da segunda aba sem o parâmetro e poderá ver que ele inicializou a cor do objeto Cor (vermelho) porque possui sua própria sessão.
Aba 2 - Sessão

Aba 2 – Sessão

Exemplo:

Neste exemplo criamos uma pagina que lê a cor de um objeto e armazena em uma sessão, você pode modificar a cor através de um parâmetro, abrir novas abas no mesmo navegador e verificar como funciona uma variável de sessão. Você também pode abrir outro navegador e verificar que a variável é inicializada novamente por se tratar de uma nova sessão.

C#

Cor.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AspNetSessionScope
{
    public class Cor
    {
        // Declara atributo
        private string cor;

        public Cor()
        {
            // Inicializa cor no construtor
            cor = "red";
        }

        // Propriedades
        public string MinhaCor
        {
            get
            {
                return cor;
            }

        }
    }
}

default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="AspNetSessionScope._default" %>
<%@ Import Namespace="AspNetSessionScope" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Desenvolvimento Aberto</title>
    <style type="text/css">

#MeuDiv {
    background-color: lightgrey;
    width: 300px;
    padding: 25px;
    border: 20px solid black;
    margin: 25px;
}

</style>
</head>
<body>
    <form id="form1" runat="server">
    <div id="MeuDiv" runat="server">
    <h1>ASP.NET - Desenvolvimento Aberto</h1>

    <h2>Escopo da Sessão - Cor</h2>

    <h3>Este é o valor da cor:</h3>
        <%
            // Se existir sessão utiliza cor
            // se não existir utiliza instancia do objeto
            string sessionCor = (string)Session["scor"];

            if (sessionCor == null)
            {
                Cor cor = new Cor();
                Response.Write(cor.MinhaCor);
            }
            else
            {
                Response.Write(sessionCor);
            }
        %>
    </div>
    </form>
</body>
</html>

default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AspNetSessionScope
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Define cor inical
            Cor cor = new Cor();
            MeuDiv.Style["color"] = cor.MinhaCor;

            // Recupera parmetro
            string parametro = Request.QueryString["Cor"];

            if (parametro != null)
            {
                // Modifica DIV e guarda cor na sessão
                MeuDiv.Style["color"] = parametro;
                Session["scor"] = parametro;
            }
            else
            {
                // Se existir sessão modifica DIV
                if (Session["scor"] != null)
                {
                    string sessionCor = (string)Session["scor"];
                    MeuDiv.Style["color"] = sessionCor;
                }
            }
        }
    }
}

A maioria das metodologias disponíveis para o desenvolvimento de software e gerenciamento de projetos incluem como pratica básica essencial o desenvolvimento e execução de testes unitários para que um projeto de desenvolvimento possa passar para próxima fase.

Uma boa execução de um projeto bem elaborado em diversas metodologias utilizam ambientes e exigem que os testes unitários sejam executados no ambiente de desenvolvimento (DEV) utilizando uma ferramenta para este proposito e reexecutados por consultores  funcionais/testadores, na fase de testes unitários no ambiente real de qualidade (QAS) para que só então possam executar a fase de testes integrados antes de aprovarem e homologarem o software para utilização em um ambiente produtivo (PRD).

O teste unitário executado do ponto de vista do setor de qualidade (QAS) é feito validando todas as partes dos software, incluindo, design intuitivo, usabilidade, teclas de atalho, layouts, grafia, links e etc. É claro que existem algumas diferenças sutis entre metodologias, como um ou outro procedimento ou diferentes nomenclaturas mas no final todas possuem o mesmo proposito, um software de qualidade, livre de erros e dentro do orçamento inicial do projeto. Bem! No mundo real, não importa qual a metodologia escolhida, isto nem sempre é possível.

Microsoft Unit Test Framework for Managed Code

O framework de testes de unidade da Microsoft para código gerenciado é instalado com o Visual Studio e fornece um framework para testar o código .NET. As ferramentas de teste de unidade do Visual Studio foram desenvolvidas para oferecer suporte a desenvolvedores e equipes que incorporam testes unitários em suas práticas de desenvolvimento de software.  Testes de unidade proporcionam aos desenvolvedores e testadores uma maneira rápida para procurar erros de lógica nos métodos de classes em soluções .NET.

Unit Test Framework: http://msdn.microsoft.com/pt-br/library/dd264975.aspx

Executando Testes Unitários no Visual Studio

1 – Crie uma solução C# para o console chamada DATesteUnitario, renomeie o arquivo da classe gerado automaticamente de acordo com a classe do código Participante encontrado logo abaixo. Crie um novo projeto C# para teste chamado DATesteUnitarioTest nesta mesma solução:

Projeto - Test - C#

Projeto – Test – C#

2 – No Solution Explorer no projeto DATesteUnitarioTest adicione uma referencia ao projeto DATesteUnitario:

Adicionar Referencia

Adicionar Referencia

3 – Renomeie a classe criada automaticamente para o projeto de testes para ParticipanteTeste e utilize os métodos do código abaixo, atente-se aos comentários do código fonte para saber mais detalhes sobre os padrões de teste nos objetos C# no Visual Studio.

  • Para efetuar um teste com erros, modifique os valores alimentados na propriedade nome e idade nos métodos de teste.
  • Para rodar o teste, clique no menu Test e escolha a opção All Tests, o Visual Studio irá abrir uma janela chamada Test Explorer onde será exibido o resultado do teste de seus métodos:
Testes com Erros

Testes com Erros

4 – Retorne os valores das propriedades como no código abaixo, selecione os dois métodos com erros na janela Test Explorer e com o botão direito escolha a opção Run Selected Tests:

Testes bem Sucedidos

Testes bem Sucedidos

 

Exemplo:

Neste exemplo criamos uma simples classe com propriedades Get e Set e uma classe de caso de teste para efetuar um teste unitário nos métodos criados.

C#

Classe – Participante

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DATesteUnitario
{
    public class Participante
    {
        // Atributos da classe
        private string nome;
        private int idade;

        // Propriedades
        public string Nome {
            get
            {
                return nome;
            }
            set
            {
                 nome = value;
            }
        }

        public int Idade {
            get
            {
                return idade;
            }
            set
            {
               idade = value;
               // Troque a linha acima por: value = idade;
               // funciona na sintaxe mas não passa no teste unitário
               // pois é erro básico de logica e pode ser escrito em
               // um momento de desatenção.
            }
        }

        static void Main(string[] args)
        {
            // Testa classe
            // Dumb Code - Sem efeito para o teste
            Participante participante = new Participante();

            participante.Idade = 20;
            participante.Nome = "João da Silva";

            Console.ReadKey();
        }

    }
}

JUnit Test Case – ParticipanteTeste

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using DATesteUnitario; // Namespace do projeto a ser testado

namespace DATesteUnitarioTest
{
    [TestClass]
    public class ParticipanteTeste
    {
        /*          
         * Você pode optar por utilizar métodos Getter e Setter como Java (Bean).
         * Entretanto na linguagem C# métodos Getter e Setter são substituidos por
         * propriedades semelhantes a linguagem de programação Object Pascal (Delphi).
         *
         * O conceito de testes unitários é utilizado sempre através de métodos Setter (Voids)
         * pois o mesmo já testa o método de retorno Getter no momento da comparação.
         * Os métodos testados são os Construtores da classe, métodos Setter ou
         * outros métodos da classes de sua preferencia.
         *
         * O Caso de teste unitário do Projeto de Test C# é bem parecido com o JUnit para Java
         * utilizando o conceito de Assert e possui os seguintes requisitos:
         *
         * O método deve ser decorado com o atributo [TestMethod].
         * O método deve retornar void.
         * O método não pode ter parâmetros.
         *
         * Como testar um básico Pattern de Objeto C#
         * baseados em Get e Set (propriedades em C#)
         * utilizando voids?
         *
         * Podemos utilizar métodos semelhantes ao JUnit do Java, mas atente-se
         * pois diferentemente do JUnit a classe de teste não está fisicamente ligada
         * a classe a ser testada e utiliza uma void padrão.
         *
         * Método de teste padrão:

        [TestMethod]
        public void TestMethod1()
        {
        }

        */

        //Testando propriedades
         [TestMethod]
        public void Nome()
        {
             // Testa propriedade Nome
             Participante p1 = new Participante();
             p1.Nome = "Nome";
             Assert.AreEqual("Nome", p1.Nome);

        }

        [TestMethod]
        public void Idade()
         {
             // Testa propriedade Idade
             Participante p2 = new Participante();
             p2.Idade = 20;
             Assert.AreEqual(20, p2.Idade);
         }

    }
}

SAP MaxDB é um banco de dados estratégico criado para rodar em todas as soluções SAP e substituir os bancos de dados Oracle, IBM DB2 e MSSQL Server  tornando as soluções SAP mais acessíveis em termos de custo para clientes de grande e médio porte. O SAP MaxDB foi construído como uma solução open source baseado em MySQL sob a licença GNU GPL, as versão anteriores do MaxDB ainda são mantidas pela comunidade open source mas a SAP não contribui mais com estas versões.

Ao longo dos últimos anos, a tecnologia SAP MaxDB continuou a evoluir com investimentos muito significativos em inovações e essas inovações não são em código aberto. Assim o mais recente produto SAP MaxDB não é open source, entretanto ele é gratuito em sua versão comunitária para uso com aplicações não SAP e possui licença comercial para uso com aplicações SAP.

Com 40 anos de inovação atuando em mais de 130 países e com mais de 100 mil clientes que utilizam soluções SAP, o SAP MaxDB ainda é um banco de dados jovem mas conta com mais de 6.500 clientes em 15.000 instalações mais soluções que utilizam liveCache e Content Server.

SAP MaxDB: http://maxdb.sap.com/

SAP MaxDB e C#

A SAP disponibiliza provedores para utilizar o MaxDB com as linguagens de programação .NET utilizando os sistemas operacionais Unix, Linux e Windows, possibilitando integrar soluções Enterprise SAP que utilizam o banco de dados MaxDB com aplicações escritas em C# ou permite que aplicações C# utilizem o SAP MaxDB gratuitamente também em soluções que não possuem o intuito de integrar dados com os sistemas SAP.

SAP ADO.NETInterface ADO.NET

Para utilizar este walkthrough completo integrando uma solução C# com a linguagem de programação ABAP, você precisa instalar vários software entres eles o NetWeaver Application Server ABAP no qual já possui uma instalação completa do ambiente de desenvolvimento SAP com uma instancia do banco de dados MaxDB, caso queira utilizar somente o lado C# você pode baixar o SAP MaxDB diretamente da SAP Store:

NetWeaver Application Server ABAP: Mini SAP

Download SAP MaxDB sistemas não SAP: SAP Store

SAP MaxDB SQL Studio: Desenvolvimento Aberto walkthrough

MaxDB Data Provider ADO.NET e MONO

O provedor ADO.NET for MaxDB RDBMS foi desenvolvido pelo projeto MONO sob a licença GNU para as versões open Source do SAP MaxDB, caso queira utilizar provedores das versões disponibilizadas pela SAP, estas já acompanham a instalação do MaxDB.

Download: http://sourceforge.net/projects/maxdbprovider/

Projeto MaxDB Mono: http://www.mono-project.com/archived/maxdb/

Conectando ao MaxDB em instancia SAP com C#

1 – Caso utilize este tutorial com o NetWeaver primeiro tenha certeza que servidor de aplicação e a instancia SAP do banco de dados está rodando, caso utilize apenas o MaxDb e C# ignore este passo:

SAP - Servidor de Aplicação - e Banco de dados - NetWeaver/MaxDB

SAP – Servidor de Aplicação – e Banco de dados – NetWeaver/MaxDB

2 – Abra o SQL Studio utilizando o servidor MaxDB e o banco de dados NSP ou seu próprio banco de dados caso não utilize o sistema SAP:

NSP - NetWeaver Database

NSP – NetWeaver Database

3 – Crie uma tabela Z que significa uma tabela não SAP Standard que não será transparente no conceito do dicionário de dados do sistemas SAP para isto utilize o script logo abaixo, não se assuste para desenvolvedores não SAP isto é apenas uma tabela comum do banco de dados:

Tabela Não Transparente

Tabela Z Não Transparente

4 – Após efetuar o download do provedor ADO.NET para MaxDB clique com o botão direito do mouse, desbloqueie o arquivo baixado, pois o arquivo foi compilado no Linux, caso contrario o Windows Smart Screen tentara bloquear o arquivo. Clique em instalar:

SAP MaxDb Provider for .NET

SAP MaxDb Provider for .NET

5 – Crie um projeto Windows Forms e disponha na tela um Label, um DataGridView e um Button e alinhe os componentes como na figura abaixo:

Design Time

Design Time

6 – Compile o programa e clique em conectar para se conectar a instancia SAP NSP:

Programa C#

Programa C#

7 – Para utilizar o ABAP para ler ou gravar dados nesta mesma tabela não transparente utilizando uma Stored Procedure no MaxDB através de códigos Native SQL, utilize o link abaixo:

Stored Procedure - Abap

Stored Procedure – Abap

Programa SAP – ABAP Native SQL: MaxDB Stored Procedure parâmetros IN e OUT

 Caso conecte em um banco de dados MaxDB utilizando soluções SAP tenha em mente que você deve respeitar o conceito de dados dos sistemas SAP e verificar os termos de garantia de cada produto SAP, visto que este método ao contrario do RFC  ignora a camada de banco de dados SAP e o dicionário de dados ABAP.

Como você pode verificar na imagem acima no ambiente ABAP o valor flutuante não vem formatado por padrão como estão acostumados os desenvolvedores SAP que utilizam instruções Open SQL e o dicionário ABAP no entanto você pode utilizar campos criados no dicionário apenas para a manipulação do valor de saída da Stored Procedure neste caso você deve alinhar os tipos de dados entre as aplicações C# e aplicações ABAP.

Exemplo:

Neste exemplo utilizamos a linguagem de programação C# para se conectar ao banco de dados SAP MaxDB em uma instancia do banco de dados do NetWeaver e integrar uma tabela não transparente que pode ser manipulada tanto do lado C# como dentro do sistema SAP utilizando Native SQL.

SQL – SAP MaxDB

-- Cria tabela no schema SAPNSP
CREATE TABLE SAPNSP.ZFUNCIONARIO
(
            ID_FUNCIONARIO INT,
            NOME VARCHAR (30),
            SOBRENOME VARCHAR(70),
            CARGO VARCHAR(30),
            SALARIO DECIMAL(9,2)
)

-- Insere dados na tabela
Insert into SAPNSP.ZFUNCIONARIO values (1,'Steve','Gates','Programador',2550.56)
Insert into SAPNSP.ZFUNCIONARIO 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 MaxDB.Data; // SAP MaxDB Data Provider for MONO 

namespace WindowsFormsApplication1
{
    public partial class FormMaxDB : Form
    {
        
        // Declara objetos
        private static MaxDBConnection connMaxDB;   // MaxDB Data Server Provider for MONO        
        private DataTable dataTable;
        string sql;
        
        // Conexão MaxDB
        void conexaoMaxDB(string Server, string Database,
                                    string Username, string Password)
        {
            try
            {
                // String de Conexao
                string connectionString =

                    // Servidor
                    "Server=" + Server +

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

                    // Usuario
                    ";User ID=" + Username +

                    // Senha
                    ";Password=" + Password;

                //Conecta ao datasource usando a conexão SAP MaxDB
                connMaxDB = new MaxDBConnection(connectionString);

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

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

        // Retorna um set de dados
        public DataTable retornaTabela(string sql)
        {
            FormMaxDB acesso = new FormMaxDB();

            // SAP MaxDB requer usuario e senha em caracteres UPPERCASE
            acesso.conexaoMaxDB("localhost", "NSP", "SAPNSP", "PASSWORD");

            // Cria comando SQL
            MaxDBCommand maxCmd = new MaxDBCommand(sql);
            maxCmd.Connection = connMaxDB;
            
            // Cria DataReader
            MaxDBDataReader maxDBreader = maxCmd.ExecuteReader();
            dataTable = new DataTable();
            dataTable.Load(maxDBreader);
            
            return dataTable;
        }

        public FormMaxDB()
        {
            InitializeComponent();
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            // Alimenta grade de dados
            FormMaxDB dados = new FormMaxDB();            
            dataGridView1.DataSource = dados.retornaTabela("Select * from SAPNSP.ZFUNCIONARIO");
        }
    }
}

Frequentemente você vai precisar manipular dados entre paginas ASP.NET, por exemplo, passar a informação da página de origem para uma página de destino. Geralmente, você pode ter uma página onde os usuários podem selecionam itens para comprar ou qualquer outra operação e quando os usuários enviam a página e você quer chamar outra página que pode processar ou exibir as informações que o usuário inseriu. Existem alguns modos de criar este efeito, nós vamos misturar as técnicas de codificação ASP.NET chamadas CodeBehind e In-line e utilizar propriedades publicas passadas através do Server.Transfer e da diretiva PreviousPageType.

Passando Parâmetros Entre Duas Paginas ASPX

Crie uma solução Web dinâmica chamada DaWeb003 em um projeto do tipo C# Empty e adicione uma pagina WebForms chamada default.aspx e outra chamada resultado.aspx. Defina a pagina default como pagina inicial da sua aplicação utilizando o botão direito na janela Solution Explorer e escolhendo a opção Set As Start Page.

1 – Para criar os objetos, na pagina inicial você pode primeiro criar uma tag <h2> e um objeto HTML chamado FieldSet, e então adicionar os componentes ASP.NET dentro dele, utilize dois Labels, dois DropDownList e um Button, você pode utilizar o Design para preencher as propriedades de seu DropDown ou pode apenas utilizar o código correspondente encontrado logo abaixo:

Design - ASPX

Design – ASPX

2 – A pagina inicial da aplicação oferece duas combinações na qual você pode selecionar, as opções pertencem umas as outras e o código na pagina C# CodeBehind processa a camada de negocio, avalia os resultados e os envia para a pagina de resultado:

C# - Codebehind

C# – Codebehind

2 – O Processo envia três parâmetros para a pagina ASPX, dois são os parâmetros que você escolheu, somente a nível de descrição, pois o processamento já foi efetuado na pagina anterior, o terceiro parâmetro é o resultado da combinação escolhida, que é nada mais que uma propriedade publica criada na própria classe da pagina principal e enviada para a pagina de resultado através de uma declaração Server.Transfer e recebida através de uma diretiva PreviousPageType referenciando a pagina origem para que a mensagem possa ser corretamente exibida para o usuário utilizando ainda a técnica de código C# na pagina ASPX chamada de In-line:

Diretiva PrevioiusPageType e In-Line Code

Diretiva PrevioiusPageType e In-Line Code

Exemplo:

Neste exemplo criamos duas paginas ASPX e utilizamos o CodeBehind no qual processa um resultado para uma seleção do usuário e o exibe através de parâmetros e uma propriedade publica. Os dados são processados na pagina de resultado por meio de código In-line.

ASPX- default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="DaWeb003._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Desenvolvimento Aberto - Passando Parâmetros Entre Paginas</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h2>Desenvolvimento Aberto - Passando Parâmetros</h2>
        <br />
      <fieldset>
      <legend>Escolha o vocalista da banda correspondente:</legend>
        <br />
        <br />
        Escolha um vocalista:<br />
        <asp:DropDownList ID="DropDownList1" runat="server" Width="200px">
            <asp:ListItem>Eddie Vedder</asp:ListItem>
            <asp:ListItem>Kurt Cobain</asp:ListItem>
            <asp:ListItem>Scott Weiland</asp:ListItem>
            <asp:ListItem>Layne Staley</asp:ListItem>
        </asp:DropDownList>
        <br />
        <br />
        Escolha a banda:<br />
        <asp:DropDownList ID="DropDownList2" runat="server" Width="200px">
            <asp:ListItem>Stone Temple Pilots</asp:ListItem>
            <asp:ListItem>Alice in Chains</asp:ListItem>
            <asp:ListItem>Nirvana</asp:ListItem>
            <asp:ListItem>Pearl Jam</asp:ListItem>
        </asp:DropDownList>
        <br />
        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Enviar" />
        <br />
        <br />
    </fieldset>
    </div>
    </form>
</body>
</html>

C#- default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DaWeb003
{
    public partial class _default : System.Web.UI.Page
    {

        // Declara variáveis para os parâmetros
        private string nome;
        private String banda;
        private Boolean valida = false;

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        // Define uma propriedade para transferencia
        public Boolean  Resultado
        {
            get
            {
                return valida;
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {

            // Recupera parametros
            nome = Request.Form["DropDownList1"];
            banda = Request.Form["DropDownList2"];

            // Se nome e banda são iguais OK ou proxima tentativa senão falso
            if ((nome.Equals("Eddie Vedder") && banda.Equals("Pearl Jam")) ||
                (nome.Equals("Kurt Cobain") && banda.Equals("Nirvana")) ||
                (nome.Equals("Scott Weiland") && banda.Equals("Stone Temple Pilots")) ||
                (nome.Equals("Layne Staley") && banda.Equals("Alice in Chains")))
            {
                valida = true;
            }

            // Transfere dados para a pagina de resultado
            Server.Transfer("resultado.aspx");

        }
    }
}

ASPX- resultado.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="resultado.aspx.cs" Inherits="DaWeb003.resultado" %>

<!-- Diretiva que aponta para a pagina origen -->
<%@ PreviousPageType VirtualPath="~/default.aspx" %> 

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Desenvolvimento Aberto - Resultado</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
     <h2>Desenvolvimento Aberto - Resultado</h2>
        <%
            Boolean resultado = PreviousPage.Resultado;
            String nome       = PreviousPage.Request.Form["DropDownList1"];
            String banda = PreviousPage.Request.Form["DropDownList2"];

            if (resultado)
            {
                Response.Write("Você acertou!!! O vocalista: " + nome + " pertence a banda: " + banda);
            }
            else
            {
                Response.Write("Você errou!!! O vocalista: " + nome + " não pertence a banda: " + banda);
            }

        %>
    </div>
    </form>
</body>
</html>

O protocolo HTTP define oito métodos (GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS e CONNECT) que indicam a ação a ser realizada no recurso especificado. O método determina o que o servidor deve fazer com a URL fornecida no momento da requisição de um recurso.  O . NET Framework é muito similar ao conceito da maquina virtual Java, entretanto a linguagem Java Enterprise Edition nos possibilita criar aplicativos Java que rodam em um servidor de aplicação Java através do encapsulamento de métodos do protocolo HTTP chamados Servlets que lida com as solicitações HTTP padrão, enviando-os para os métodos de manipulador para cada tipo de solicitação HTTP utilizando uma classe Java em uma aplicação para exibir uma pagina web, sem utilizar uma pagina web estática, o conceito de CodeBehind do ASP.NET necessita que uma classe C# rode atrás de pelo menos uma pagina ASPX.

Deste modo o Microsoft ASP.NET não fornece um equivalente direto para a classe servlet. Em vez disso, existem duas alternativas. A primeira alternativa, que é usado pelo Assistente de Conversão de Linguagem Java (JLCA), é encapsular a funcionalidade de um servlet no code-behind de uma página ASP.NET não gráfica. A outra alternativa é o de criar um novo HttpHandler e dirigir um pedido de URL para uma classe especificada. O HTTPHandler é realmente o mais perto da nova funcionalidade do filtro na especificação servlet.

Se você deseja fornecer sua própria implementação de servlets, você precisa criar uma página WebForm. No entanto, você vai estender a classe de pagina e na maioria dos casos, você simplesmente vai incluir a funcionalidade do seu servlet dentro do método Page_Load(). Mas se você deseja examinar o tipo de solicitação HTTP e sua respectiva resposta, você pode criar métodos similares ao métodos de um Servlet. Mais informações sobre ASP.NET e técnicas de migração:

ASP.NET – Java Servlet: http://msdn.microsoft.com/en-us/library/aa478987.aspx

Métodos doGet e doPost

Basicamente você utiliza o método doGet sempre que a requisição que você faz não altere o estado do servidor, como uma consulta, uma busca e etc. O método doPost envia dados para serem processados (por exemplo, dados de um formulário HTML) para o recurso especificado. Os dados são incluídos no corpo do comando.

Utilizando os métodos doGet e doPost

1 – Crie uma aplicação do tipo ASP.NET Web Application com o modelo C# Empty e chame seu projeto de DaWeb002, crie uma nova pagina WebForms chamada default. Na pagina default.aspx comente todo o código HTML exceto a primeira linha, veja a figura abaixo:

WebForm - default.aspx

WebForm – default.aspx

2 – Na implementação do código C# da pagina, vamos simular uma aplicação Web que utiliza os métodos do protocolo HTTP, utilize o código abaixo para completar seu código gerado automaticamente. Rode o programa, como você pode ver nós criamos uma pagina html através do método doGet, ele é automaticamente disparado assim que o servidor processa a url da nossa aplicação 

doGet - url - ASP.NET

doGet – url – ASP.NET

3 – Porem, o método doGet é utilizado para passar informações do navegador para o servidor, isto significa que vamos efetuar uma requisição Client-Server, vamos passar um parâmetro através do nosso browser para que o valor seja processado no servidor de aplicação ASP.NET, vamos fazer isto de um modo manual. O método para se passar parâmetros para o servidor é utilizando o caractere de “?” (interrogação) seguido sem espaço pelo nome do parâmetro adicionado do sinal de “=” (igual) e o valor desejado, caso haja mais que um parâmetros separe-os como o caractere “&” (E comercial ou Ampersand). Apenas adicione o parâmetro no final na URL gerada pelo seu navegador, atente-se a porta do seu servidor web:

http://localhost:29193/default.aspx?Parametro1=Meu parametro teste

Assim que a aplicação executar o método doGet novamente ela vai automaticamente identificar o parâmetro utilizando na requisição GET e imprimir uma linha na pagina HTML.

Aplicação - WebForm

Aplicação – WebForm

4 – O método doPost é disparado quando você clica no botão do formulário html e a ação solicita uma requisição a aplicação, o nosso método apenas imprime uma linha no navegador:

Servlet - doPost

Servlet – doPost

Exemplo:

Neste exemplo nos criamos uma aplicação web dinâmica simulando um Servlet Java e utilizamos os métodos doGet e doPost estendendo a classe da pagina. Utilizamos também a manipulação simples de um parâmetro para a requisição doGET.

Para ver esta mesma aplicação utilizando um Java Servlet: clique aqui.

Html – aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="DaWeb002._default" %>

<!--

<!DOCTYPE html>

*** Comentar as todas instruções da pagina ASP.NET - WebForm ***

    Não comente a primeira linha pois a pagina é utilizada sob o
    conceito CodeBehind e necessita da ligação da pagina ao arquivo
    de código fonte csharp: CodeBehind="default.aspx.cs"

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>

--!>

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DaWeb002
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.HttpMethod.Equals("GET"))
            {
                // HTTP transfere dados quando o método é "GET"
                doGet();
            }
            if (Request.HttpMethod.Equals("POST"))
            {
                // HTTP transfere dados quando o método é "POST"
                doPost();
            }
        }

        // Executa método HTTP GET
        private void doGet()
        {
            String meuHtml = "<html xmlns=\"http://www.w3.org/1999/xhtml\">" +
                           "<head><title>Desenvolvimento Aberto</title></head>" +
                           "<body>" +
                           "<h1>Desenvolvimento Aberto</h1> <br />" +
                           "<h3>C# - HTTP GET - doGet</h3>" +
                           "Pagina criada pelo metodo do GET <br />" +

                           // Para que o método post seja disparado
                           // o form precisa saber o método - method="post"
                           // também funciona com o metodo get

                           "<form id=\"form1\" runat=\"server\" method=\"post\"> <br />" +
                           "<input type=\"submit\" value=\"Enviar\">" +
                           "</form>" +
                           "</body>" +
                           "</html>";

            Response.Write(meuHtml);

            string parametro = Request.QueryString["Parametro1"];

            if (parametro != null)
            {
                Response.Write("O parametro digitado foi: " + parametro);
            }

        }

        // Executa método HTTP POST
        private void doPost()
        {
            Response.Write("O método POST foi disparado!!!!");
        }
    }
}

O ASP.NET é um framework web livre para a construção de sites e aplicativos da Web usando HTML, CSS e JavaScript. Você também pode criar APIs Web, sites móveis, utilizar as tecnologias em tempo real como Web Sockets e muito mais. O Framework ASP.NET oferece três modelos para a criação de aplicações para a internet: Web Forms, ASP.NET MVC e páginas da Web ASP.NET. Todos os três modelos são estáveis ​​e maduros, e você pode criar grandes aplicações web com qualquer um deles. Não importa o framework que você escolher, você vai ter todos os benefícios e recursos do ASP.NET em todos os lugares.

Cada Framework tem como alvo um estilo de desenvolvimento diferente. O que você escolher depende de uma combinação de seus ativos de programação (conhecimento, habilidades e experiência em desenvolvimento), o tipo de aplicação que você está criando, segundo a Microsoft todos os três modelos serão apoiados, atualizados e melhorados em futuras versões do ASP.NET.

Para programar gratuitamente utilizando o framework ASP.NET utilize o Visual Studio Express for Web:

VS Express Web: http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-web

Sobre ASP.NET e a Microsoft

Como sabemos a Microsoft é uma empresa de softwares proprietários ou seja sistemas que não estão sobre uma licença aberta, então é muito comum novos desenvolvedores ou até desenvolvedores experientes que migraram das antigas tecnologias do Windows para o .NET Framework pensarem que toda tecnologia e as técnicas que estão utilizando são de propriedade da Microsoft, mas não são, a maioria dos padrões estabelecidos que você usa quando utiliza o .NET Framework não são da Microsoft, por exemplo, o .NET Framework e a linguagem de programação C# são muito, mas muito parecidos com a tecnologia Java, utilizando vários de seus padrões, se analisarmos os programas mais básicos quase não se nota diferença de sintaxe e quando a sintaxe é diferente os objetos ainda possuem um proposito muito semelhantes. Utilize o link a seguir para saber sobre este assunto:

C# para desenvolvedores Java: http://msdn.microsoft.com/en-us/library/ms228602(v=vs.90).aspx

Com o ASP.NET a coisa funciona do mesmo jeito só que um pouco mais acentuado, pois a internet utiliza vários padrões e tecnologias de código aberto, tornando o ASP.NET dependente destas tecnologias e padrões para se tornar competitivo, entre os mais básicos estão o HTML, CSS, Javascript até os padrões e frameworks mais avançados como os que estão sob a licença Apache (principal concorrente do servidor web Microsoft para ASP.NET o IIS). Entre estas tecnologias e padrões estão também os Design Patterns como o MVC, isto, MVC não é uma tecnologia da Microsoft e nem é uma tecnologia em si, e sim um Desing Pattern, para que você tenha uma ideia o Pattern MVC existe desde 1979  e após ser amplamente utilizado por vários frameworks de código aberto, só em 2009 foi adotado pela Microsoft, como uma novidade para a tecnologia ASP.NET:

Para saber mais sobre as tecnologias e padrões externos do ASP.NET utilize o link a seguir:

ASP.NET Open Source: http://www.asp.net/open-source

Criando uma Aplicação ASP.NET com C#

Quando você cria uma aplicação ASP.NET pelos Templates do Visual Studio, é gerado uma aplicação completa, utilizando vários elementos da tecnologia ASP.NET, no entanto as paginas ASP.NET são um pouco mais pesadas do que outras tecnologias da web, para resolver este problema você pode criar projetos à partir de modelos vazios ou utilizar alguns frameworks baseados em javascript, caso tenha intuito de fazer uma aplicação rápida e enxuta. Para criar uma aplicação ASP.NET a partir do zero siga os seguintes passos:

1 – Abra o Visual Studio e crie um novo projeto C# para web do tipo ASP.NET Web Application, dê um nome para sua solução e clique em OK:

Web Application

Web Application

2 – Escolha um projeto C# Empty (vazio) e clique em OK:

Projeto Vazio

Projeto Vazio

3 – Para criar uma pagina Aspx, clique no seu projeto com o botão direito na janela Solution Explorer e selecione ADD, Webform. Uma pagina XHTML com código HTML básico será criado para você. A IDE para ASP.NET é muito semelhante aos Windows Forms, utilizando as abas Design e Code para alternar entre a IDE Visual e a IDE de código ou ainda Split, para ter as duas visões ao mesmo tempo. Utilize o código HTML abaixo para completar seu código gerado automaticamente:

Página ASP.NET

Página ASP.NET

4 – O ASP.NET utiliza um conceito de Code-Behind, a cada pagina ASPX você tem uma classe com código C#, isso permite uma separação limpa de seu HTML de sua lógica de apresentação e também o conceito de código in-line que é o código que está incorporado diretamente dentro da página ASP.NET. Uma pagina WebForms nada mais é que uma pagina ASPX que utiliza FORM HTML e também componentes criados pelo framework WebForms do ASP.NET. Vamos utilizar para este exemplo objetos HTML e não ASP.NET. Você pode notar que quando utilizou o código HTML abaixo e clicou no botão de Design, automaticamente os componentes do formulário HTML foram reconhecidos, exceto pelo código in-line dinâmico que utilizamos na pagina ASPX:

Design - HTML

Design – HTML

5 – Complete a classe C# com o código abaixo e rode o programa, o resultado será exibido no navegador web padrão:

Navegador - Web - ASPX

Navegador – Web – ASPX

6 – Assim que você clica no botão o código da classe por traz da sua pagina é executado, capturando os valores do código HTML para serem utilizados em sua pagina:

Code-behind

Code-behind

Exemplo:

Neste exemplo criamos uma aplicação ASP.NET à partir de um modelo de projeto vazio e utilizamos uma pagina WebForms para criar nossa pagina web com formulários do tipo HTML, utilizamos C# para executar as ações da nossa pagina através do conceito de código ASP.NET chamados de code-behind e in-line.

XHTML

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="DaAspNet1._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <fieldset>
            <p>
               <!-- Este é o modo de escrever código C# em uma pagina html -->
               <!-- utilize a marcação abaixo: -->
               <%
                  Response.Write("Desenvolvimento Aberto (Titulo C# Dinâmico)");
               %>
            </p>
            <br />
            <legend>Escolha uma banda:</legend>
            <br /> Seu Nome:<br /> <input type="text" name="Nome" /> <br />
            <br /> Bandas: <br /> <select name="bandas">
                    <option value="Stone Temple Pilots">Stone Temple Pilots</option>
                    <option value="Alice in Chains">Alice in Chains</option>
                    <option value="Screaming trees" selected>Screaming trees</option>
                    <option value="Mother Love bone">Mother Love bone</option>
            </select> <br /> <br />

        <!-- Cria um botão HTML para ASP.NET!-->
       <input id="Meubotao" runat="server" class="button right" onserverclick="Meubotao_ServerClick" type="button" value="Enviar" />
    </fieldset>
    </div>
    </form>
</body>
</html>

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DaAspNet1
{
    public partial class _default : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Meubotao_ServerClick(object sender, EventArgs e)
        {
            // Recupera dados do HTML
            String nome = Request.Form["Nome"];
            String banda = Request.Form["bandas"];

            // Cria HTML Dinâmico
            Response.Write("Desenvolvimento Aberto ASP.NET: <br />" );
            Response.Write("Nome: " + nome + " <br />");
            Response.Write("Banda escolhida: " + banda + " <br />");
        }        

    }
}

O termo Enterprise se refere a organização empresarial corporativa. Na indústria de computadores, o termo é frequentemente usado para descrever qualquer grande organização que utiliza computadores, sistemas operacionais, softwares ou ferramentas de desenvolvimento para o mundo dos negócios. E ao analisarmos o DNA das soluções Enterprise que encontramos nos dias de hoje, sem duvida encontraremos a herança de uma empresa que foi amplamente responsável por tudo que conhecemos, a IBM, empresa pioneira no desenvolvimento de hardware e softwares corporativos.

O principal software corporativo é chamado de Enterprise Resource Planning (ERP) e grande parte de toda infraestrutura e metodologias existentes no universo corporativo prezam garantir que este software funcione perfeitamente desde o inicio da era da computação empresarial. O ERP nasceu de seu antecessor, Manufacturing Resource Planning (MRP) e evoluiram desde os primórdios dos pacote de gerenciamento de banco de dados comercial desenvolvido por Gene Thomas na IBM na década de 1960. Logo os primeiros sistemas ERP foram concebidos como uma ferramenta organizacional e de programação para as empresas industriais. A função da próxima geração de sistemas de software ERP foram estendidos além dos limites do que poderia ser feito para uso interno de uma empresa de fabricação individual e começou a incluir clientes e fornecedores. Não demorou muito para que outras indústrias reconhecessem os benefícios dos sistemas ERP, então as agências governamentais e organizações do setor de serviços também começaram a tirar proveito desta tecnologia.

A evolução se deu dos processos executados em grandes mainframes, como IBM/360 para os processos atuais que gerenciam enormes quantidades de dados em tempo real e são executados em diferentes plataformas transpondo os limites físicos das empresas, permitindo que o processo de trabalho continue sem fronteiras e a qualquer hora, em qualquer lugar.

De onde vem os softwares Enterprise?

Um rápido passeio pela historia das três maiores soluções Enterprise encontradas no mercado de software da atualidade, nos mostram o como foi o inicio dos sistemas corporativos:

A SAP AG criada em 1972 por cinco consultores da IBM que perceberam a possibilidade de criar um pacote de software padrão a ser executado em um mainframe IBM. Em dezoito meses foi criado o sistema R que foi renomeado para R/1, sendo seguido pelo sistema R/2 de duas camadas e logo depois o R/3 apareceu inicialmente no final dos anos 80 quando a IBM lançou sua arquitetura SNA, mas foi decidido trabalhar com Unix no lugar do mainframe IBM e após cinco anos de desenvolvimento, em 1992 o sistema R/3 finalmente foi lançado.

A JD Edwards World Solution Company, foi fundada em março 1977 e era uma empresa de software empresarial, o foco inicial da empresa foi o desenvolvimento de um programa de contabilidade necessário para seus clientes. Seu produto mais popular chamado World era centralizado em servidores, bem como multiusuário; os usuários poderiam acessar o sistema usando um dos vários terminais de computador da IBM ou “telas verdes”. Como um sistema ERP, o JD Edwards World incluía as três áreas básicas de atuação: analista funcional/negócios, desenvolvedor/programador e  administração do sistema.

O Microsoft Dynamics AX foi originalmente desenvolvido como uma colaboração entre a IBM e a dinamarquesa Damgaard Data que resultou no IBM Axapta. O Axapta foi inicialmente lançado em março de 1998, nos mercados dinamarqueses  e norte-americanos. A IBM devolveu todos os direitos sobre o produto para a Damgaard Data logo após o lançamento da versão 1.5 antes da Damgaard Data ser fundida com Navision Software A/S em 2000, a empresa combinada, inicialmente Navision Damgaard, depois Navision A/S, foi adquirida pela Microsoft em julho de 2002 e em setembro de 2011, a Microsoft anunciou o lançamento da versão nova AX 2012.

Hoje a IBM não possui uma solução de ERP mas ela endossa através de suas alianças poderosas soluções em conjunto com a SAP e Oracle:

IBM ERP Alliance: http://www.ibm.com/solutions/alliance/us/en/index/erp.html

????????????????????????????????????????
O que os Softwares Corporativos Podem Fazer?

Unificar os dados como um todo, integrando os sistemas de gestão empresarial, permitindo a centralização de todo o negócio em uma única fonte, pois são desenvolvidos para atender às necessidades das diferentes áreas de uma empresa.

As varias ferramentas oferecem aos seus gestores um maior controle sobre suas operações e planejamentos, interligando todos os departamentos e se tornando um importante apoio às decisões estratégicas da diretoria, indicando os mercados mais lucrativos no qual pode-se investir.

Como beneficio a empresa passa a obter maior agilidade aos processos e uma maximização de resultados a longo prazo, com a padronização das informações internas consegue-se uma ampla visibilidade dos procedimentos empresariais e uma automação das dinâmicas de apoio. A obtenção de dados em tempo real, possibilita a eliminação das falhas de comunicação entre os setores e um melhor gerenciamento de qualidade de seus produtos ou serviços e também um melhor relacionamento com os seus clientes.

Como é a arquitetura de um software Enterprise?

Os softwares Enterprise geralmente utilizam o topo da tecnologia disponível em termos de hardware. Novos hardwares são construídos para atender as novas exigências que as empresas demandam com o crescimento baseado no beneficio da tecnologia que elas adquirem, sendo assim novos hardwares necessitam de novas versões de softwares e sistemas operacionais para que possam ser controlados, gerando um ciclo de desenvolvimento de tecnologia de ponta.

Os programas Enterprise atuais utilizam uma arquitetura de três camadas, cada camada é auto contida o suficiente de forma que a aplicação pode ser dividida em vários computadores em uma rede distribuída. As camadas são compostas da interface do usuário (Camada de Apresentação ou Servidor de Apresentação); da lógica do negócio (Camada de Negócio ou Servidor de Aplicação) e da camada de banco de dados (Camada de Dados ou Servidor de Dados). Cada camada desta arquitetura é normalmente mantida em um ou mais servidores para tornar-se mais escalonável e independente das demais. Com o mesmo objetivo são utilizadas tecnologias de middleware como, por exemplo, COM, CORBA, Web Services ou RMI. Esta arquitetura tem como características baixos custos de disponibilização, de mudança da base de dados, de mudança na lógica de negócios, eficiente armazenamento e reutilização de recursos.

Três camadas SAP:

R/3 - Três camadas

R/3 – SAP – Três camadas

Três camadas Oracle:

JD Edwards - três camadas

JD Edwards – Oracle – Três camadas

Três camadas Microsoft:

Dynamics - Microsoft - Três camadas

Dynamics – Microsoft – Três camadas

Como funcionam na pratica para desenvolvedores e consultores?

Os softwares corporativos que integram a linha empresarial como já vimos ditam não só a tecnologia de hardware e software mas também o funcionamento de empresas de tecnologia, de desenvolvimento ou consultorias que trabalham com este tipo de solução.

No mercado de softwares corporativos um desenvolvedor em alguns casos também é um tipo de consultor ou especialista, outras profissões que conhecemos no mercado da tecnologia também se enquadram no time de consultores tendo sua própria nomenclatura, os códigos fontes são abertos e podem ser herdados e modificados, porem geralmente tudo que é desenvolvido dentro de um software corporativo pela licença sob o qual ele é gerido é de propriedade da empresa fabricante do software, entretanto é permitindo que consultorias desenvolvam e comercializem módulos adicionais para seus produtos seguindo as melhores praticas de desenvolvimento, implantação e manutenção da empresa detentora da solução.

Os sistemas ERP podem se conectar com qualquer banco de dados topo de linha do mercado e tem como parceiros as empresas fabricantes de cada banco, quando também não é proprietária de uma solução de banco de dados, em ambos os casos os bancos de dados possuem Features exclusivas desenvolvidas para uso com cada um destes sistemas. Os sistemas ERP contam com um dicionário de dados que controla o banco de dados em uso, permitindo que o sistema e os desenvolvedores utilizem uma linguagem única para acesso a dados. Possuem também seu próprio compilador e sua própria linguagem de programação na qual as consultorias podem desenvolver novos módulos ou modificar módulos existentes.

A SAP possui a linguagem Abap, a Oracle utiliza entre outros métodos a linguagem C e a Microsoft a linguagem X++. As empresas terceirizadas também podem desenvolver outros softwares corporativos que se comunicam com o ERP através de um protocolo de comunicação especifico, geralmente utilizando as tecnologias DCOM ou Corba e são nada mais que interfaces para a comunicação entre um sistema proprietário e outro compatível de terceiros através de conexões TCP/IP e podem chamar funções remotas do ERP que são criadas para inserir ou exportar dados garantindo a consistência de dados utilizando a própria regra de negocio do ERP e fornecendo uma maneira para que um programa externo escrito em linguagens como  Java, C, C ++C# ou outras línguas possam também atuar como o cliente ou servidor em uma chamada.

SAP – Abap: Linguagem de programação.

Oracle – JDE: Development Tools.

Microsoft – MorphX: IDE e linguagem X++.

Solutions_key
Como é a Metodologia dos Softwares Enterprise?

Com décadas de experiência no mercado corporativo os softwares empresariais desenvolveram algumas metodologias ao longo dos anos que possibilitam que as empresas utilizem de forma adequada suas soluções, abrangendo todas as fases de um projeto desde a engenharia de software, a definição de escopo, passando pela especificação funcional, design, construção, testes, até chegar à validação, implantação e uso produtivo da solução.

ASAP Methodology: Metodologia ASAP

Oracle Unified Method: Metodologia OUM

Microsoft Dynamics Sure Step methodology: Metodologia MS Sure Step

Falando de modo genérico já que estamos nos referindo a três ótimos softwares empresariais da atualidade, podemos perceber que os três possuem uma arquitetura semelhante que proporciona uma metodologia muito similar para execução de seus projetos, deste modo, segue uma visão geral de um projeto corporativo.

A fase de preparação geralmente é executada por um gerente de projetos e engloba o escopo, estimativas, planejamento inicial do projeto, cronograma, aspectos técnicos, definição de equipe, identificação de riscos e estratégias, planejamento de controle de qualidade e o inicio do projeto.

A fase inicial, já com os recursos definidos em ação, o gerente de projeto e os analistas funcionais devem tratar do levantamento dos processos de negócio, gestão do projeto, mudanças organizacionais, definição dos novos processos de negócio, necessidades e mudanças organizacionais.

Com toda a definição realizada, já na fase de customização e desenvolvimento, entra em cena os consultores especialistas que iniciam a configuração, implementação e o desenvolvimento das definições funcionais que entre elas estão a configuração base, a configuração final, desenvolvimento de programas, implementação de interfaces, testes unitários, testes integrados, documentação de cenários e processos, execução dos treinamentos aos key users e usuários, controle de qualidade e a correção de possíveis erros.

Na fase de pré-produção toda atenção se volta aos detalhes finais como, testes de volume, testes de stress, planejamento da implantação, estratégia de implantação, treinamentos finais e o controle de qualidade.

Com tudo pronto o projeto é finalmente implantado e o sistema é colocado em produção e os retoques finais são a transferência de pré-produção, ajuste da configuração de hardware, ajustes na configuração de software, base de dados, sistema operacional e outros. Só então se inicia os treinamentos finais, suporte aos key-users e usuários e encerramento do projeto.

Ambientes Corporativos

Integrando a metodologia de gestão de projeto os softwares corporativos e suas demais ferramentas são desenvolvidas para utilizar ambientes específicos nos quais tem o intuito de maximizar a eficiência dos métodos de implantação, desenvolvimento, testes, qualidade, treinamento, utilização e gerenciamento dos produtos adquiridos. Cada ambiente possui suas especificações de uso e são utilizados para uma finalidade especifica e devido a eficiência deste modelo outras metodologias também utilizam alguns destes cenários.

Ambientes do SAP:

Alguns dos ambientes SAP

Alguns dos ambientes SAP

Ambientes da Oracle:

Alguns dos ambientes Oracle

Alguns dos ambientes Oracle

Ambientes da Microsoft:

Alguns dos ambientes Microsoft

Alguns dos ambientes Microsoft

Como Desenvolver Suas Próprias Aplicações Enterprise?

As grandes empresas de tecnologia que desenvolvem o hardwaresoftware para o mercado corporativo em sua maioria também desenvolvem ferramentas para desenvolvimento de softwares para empresas terceirizadas, para que estas possam desenvolver seus próprios softwares empresariais ou soluções que complementas as soluções já existentes, entre elas a Oracle, a IBM, a Microsoft e com exceção da SAP que também utilizam em certos casos o Java da Oracle e ferramentas da IBM como a IDE Eclipse. Todas disponibilizam um vasto matérial sobre como desenvolver seus próprios projetos Enterprise, veja os seguintes links:

Microsoft: http://msdn.microsoft.com/en-us/library/ff648951.aspx

Oracle: http://www.oracle.com/technetwork/java/javaee/overview/index.html

IBM: http://www.ibm.com/developerworks/

SAP: Enterprise Learning

O primeiro passo é ter em mente que um software enterprise bem sucedido necessita de hardware adequado, arquitetura e programação adequada, metodologia adequada, consultoria adequada e o mais importante de tudo um grande know-how das regras de negocio das áreas incluídas no escopo de sua solução.

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";
            }
        }
    }
}