Entries:
Comments:
Discussions:

Loading user information from Channel 9

Something went wrong getting user information from Channel 9

Latest Achievement:

Loading user information from MSDN

Something went wrong getting user information from MSDN

Visual Studio Achievements

Latest Achievement:

Loading Visual Studio Achievements

Something went wrong getting the Visual Studio Achievements

Banco de Dados

Banco de Dados

Renato Haddad

Microsoft Most Valuable Professional MVP, MCT, MCPD e MCTS

Tecnologias

Visual Studio .NET 2010, C#

 

Introdução

Neste artigo irei abordar um dos tópicos mais usados no desenvolvimento de softwares, que é o acesso a dados. Vou ilustrar o conceito de banco, entidades, relacionamento entre entidades e o famoso CRUD (Create, Read, Update e Delete), que para nós brasileiros é o criar, ler, atualizar e excluir dados.

Quando falamos em banco de dados pensamos num conjunto de informações armazenadas em algum repositório, de forma que se possam manipular tais informações. O mais conhecido da Microsoft é o SQL Server, e no artigo faremos acesso a ele.

Outro ponto importante de comentar é que o acesso a dados será feito usando o ADO.NET e suas classes, ou seja, será direto nas entidades, não irei usar nenhuma tecnologia de modelagem de objeto relacional, como por exemplo, o fantástico Entity Framework 4.

 

O que é um banco de dados?

Costumo definir que banco de dados é um repositório de informações organizadas. No SQL Server organizamos estas informações de forma relacional, permitindo fazer consultas envolvendo diversas entidades.

 

O que é uma entidade?

Entidade é o local onde as informações relacionadas a um conjunto são armazenadas. Por exemplo, se pensarmos em uma entidade de pessoas, teremos todas as informações sobre a pessoa como nome, e-mail, telefone, endereço, etc.

No entanto é comum ter diversas entidades no banco. Algumas aplicações grandes de ERP chegam a ter cerca de 600 entidades.

E como que uma entidade se relaciona a outra? Em primeiro lugar, sim, é possível relacionar diversas entidades entre si. Segundo, o tipo de relacionamento define a maneira que serão armazenados os dados. Temos os seguintes tipos:

 

- Um para Muitos – um registro na entidade A contém diversos registros na entidade B. Por exemplo, um cliente de vários pedidos, um clube tem diversos jogadores.

 

- Um para Um – um registro na entidade A contém apenas um registro na entidade B. Por exemplo, um cliente na entidade A contém as informações sobre aspectos comerciais na entidade B e também informações sobre informações de créditos na entidade C.

 

- Muitos para Muitos – o mesmo registro pode estar relacionado várias vezes nas entidades A e B. Por exemplo, uma mulher pode ter diversos homens, e um homem pode ter diversas mulheres.

 

Tipos de Campos

Todo banco de dados dispõe os tipos de campos para informações específicas. Isto tudo para facilitar o uso, acesso, conversões na programação, compartilhamento com outros bancos e aplicações. Veja alguns tipos de dados: string (texto), integer (inteiro), double (duplo), money (monetário), data (data), dateTime (data e hora), binário, image (imagem). Claro que cada tipo de banco de dados tem tipos diferentes, mas em linhas gerais estes são os mais comuns.

 

Ler Dados do Banco

Vamos aos códigos. Primeiramente utilizarei o banco de dados northwind, que é o mais conhecido no mundo, o qual você pode fazer download no link http://northwinddatabase.codeplex.com/  e instalar no SQL Server.

 

Na programação o primeiro passo definir a string de conexão, sendo necessário definir o Data Source (servidor), o Initial Catalog (nome do banco de dados), Integrated Security (segurança integrada), user id (usuário) e password (senha). Claro que cada string de conexão depende de onde está instalado e os dados podem ser diferentes.

Por exemplo, a linha a seguir representa a string de conexão na minha máquina, o qual MARTE é o nome da minha máquina (pode ser o número IP, . (ponto) ou localhost). O nome do banco é o Northwind e uso segurança integrada.

 

string conexao = "Data Source=MARTE;Initial Catalog=Northwind;Integrated Security=True";

 

Como usarei o SQL Server, é preciso declarar o namespace a ser usado que contém todos os métodos e propriedades da classe de acesso a dados. Portanto, o código a seguir deverá ser declarado na lista de using.

using System.Data.SqlClient;

 

 

Em seguida, no formulário da aplicação desktop, adicionei um botão e um gridView. O seguinte código irá ler todos os dados da tabela Produtcs (produtos) e mostrará no controle dataGridView1.

 

try

{

    string sql = "Select * From Products";

    using (SqlConnection conn = new SqlConnection(conexao))

    {

        conn.Open();

        DataTable dt = new DataTable();

 

        using (SqlCommand cmd = new SqlCommand(sql, conn))

        {

            SqlDataReader reader = cmd.ExecuteReader();

            dt.Load(reader);

            reader.Close();

        }

        conn.Close();

        dataGridView1.DataSource = dt;

    }

}

catch (Exception)

{

    MessageBox.Show("Ocorreu algum erro na leitura do banco");

}

 

Veja a explicação detalhada do código:

O try / catch controla se houve ou não o possíveis erros.

try

{

 

Esta é a instrução T-SQL (Transact SQL) para ler todos (*) os registros da entidade Products.

string sql = "Select * From Products";

 

Aqui é definido o objeto SqlConnection responsável em realizar a conexão com o banco de dados localizado na variável conexao. Em seguida é feita a abertura da conexão com o Open.

using (SqlConnection conn = new SqlConnection(conexao))

{

        conn.Open();

 

O objeto DataTable criará uma tabela na memória, mas será usado logo a seguir.

DataTable dt = new DataTable();

 

Agora é preciso executar a consulta no banco, ou seja, o SqlCommand é o comando que pega a instrução T-SQL definida na variável sql e executa na respectiva conexão definido no objeto conn.

using (SqlCommand cmd = new SqlCommand(sql, conn))

{

 

Uma vez executado o SqlCommand, o objeto SqlDataReader irá efetivamente carregar os dados definidos no comando cmd.

SqlDataReader reader = cmd.ExecuteReader();

 

Nesta hora usei o método Load do DataTable o qual lê o DataReader declarado em reader. É exatamente agora que os dados vão pra memória na tabela dt (DataTable).

dt.Load(reader);

 

Uma vez lidos os registros, os comandos Close fecham tanto o DataReader quanto a conexão.

reader.Close();

}

conn.Close();

 

Como os dados estão na memória e devem ser mostrados no objeto dataGridView1, usamos a propriedade DataSource e atribuímos o dt (DataTable). Pronto, os dados são mostrados ao usuário.

dataGridView1.DataSource = dt;

}

}

 

Caso ocorrem algum erro no caminho, é exibida a mensagem a seguir para o usuário.

catch (Exception)

{

    MessageBox.Show("Ocorreu algum erro na leitura do banco");

}

 

Veja o resultado da execução.

 

Agora vamos aprender como filtrar dados, neste caso o usuário irá digitar o valor do preço do produto e o código irá filtrar todos os produtos onde o preço for maior ou igual. Veja o código completo.

 

try

{

    string sql = "Select * from Products Where UnitPrice >= @preco";

    using (SqlConnection conn = new SqlConnection(conexao))

    {

        conn.Open();

        DataTable dt = new DataTable();

 

        using (SqlCommand cmd = new SqlCommand(sql, conn))

        {

            cmd.Parameters.AddWithValue("@preco",

                Convert.ToDecimal(textBox1.Text));

 

            SqlDataReader reader = cmd.ExecuteReader();

            dt.Load(reader);

            reader.Close();

        }

        conn.Close();

        dataGridView1.DataSource = dt;

    }

}

catch (Exception)

{

    MessageBox.Show("Ocorreu algum erro na leitura do banco");

}

 

Basicamente o código é igual ao anterior, exceto estas duas linhas. A instrução T-SQL seleciona todos os produtos onde (Where) o campo UnitPrice (preço) for >= (maior ou igual) ao @preco. O @preco significa que é um parâmetro, o qual está declarado na linha seguinte. A sintaxe informa que o comando cmd declara o parâmetro Parameters e adiciona o valor AddWithValue declarado no @preco contendo o valor digitado pelo usuário no controle textBox1. A propriedade Text lê o valor digitado.

 

string sql = "Select * from Products Where UnitPrice >= @preco";

cmd.Parameters.AddWithValue("@preco",

Convert.ToDecimal(textBox1.Text));

 

Veja o resultado com o filtro 60. Observe a coluna UnitPrice.

 

Atualizar Dados no Banco

Todo banco de dados pode disponibilizar registros para ser atualizado, isto é comum. Neste exemplo iremos atualizar o campo UnitsInStock (quantidade no estoque) igual ao valor que o usuário digitar. No entanto, quando se atualiza dados é importante destacar para qual registro será realizada a operação. Neste caso, a quantidade no estoque será atualizada somente para o produto onde o campo ProductID (código do produto) for igual ao código que o usuário digitar. Veja o código completo.

 

try

{

    string sql = "Update Products SET UnitsInStock=@qtde Where ProductID=@codigo";

 

    using (SqlConnection conn = new SqlConnection(conexao))

    {

        conn.Open();

 

        using (SqlCommand cmd = new SqlCommand(sql, conn))

        {

            cmd.Parameters.AddWithValue("@qtde",

                Convert.ToInt16(txtEstoque.Text));

 

            cmd.Parameters.AddWithValue("@codigo",

                Convert.ToInt16(txtID.Text));

 

            cmd.ExecuteNonQuery();

 

            MessageBox.Show("Estoque atualizado");

        }

        conn.Close();

    }

}

catch (Exception)

{

    MessageBox.Show("Ocorreu algum erro na atualização de dados");

}

 

Vamos a explicação detalhada das linhas que interessam, pois o restante é igual aos códigos vistos anteriormente. Veja a instrução T-SQL dizendo Update (Atualize) a tabela Products (Produtos) para o campo (SET UnitsInStock) igual ao parâmetro @qtde que é a quantidade que o usuário digitar. Como a atualização será feita somente para um produto o Where (onde) aplica o filtro com a condição ProductID (código do produto, este é um campo chave e único) for igual ao parâmetro @codigo cujo valor o usuário também irá digitar. Nestas instruções de atualização se você não declarar o filtro (Where) a execução se dará para todos os registros da entidade, então, preste atenção e aplique o filtro quando necessário.

 

string sql = "Update Products SET UnitsInStock=@qtde Where ProductID=@codigo";

 

Veja a declaração dos dois parâmetros que o usuário irá digitar as informações nas caixas de texto.

 

cmd.Parameters.AddWithValue("@qtde",

Convert.ToInt16(txtEstoque.Text));

 

cmd.Parameters.AddWithValue("@codigo",

      Convert.ToInt16(txtID.Text));

 

Esta linha executa a operação em si. Toda e qualquer operação que não seja de leitura, use o ExecuteNonQuery para efetivar o comando no banco.

 

cmd.ExecuteNonQuery();

 

 

A seguir vamos aprender como fazer inclusão de dados no banco de dados. Neste exemplo eu não criei uma interface de usuário para que ele digite as informações, apenas fixei os dados porque o foco é mostrar como incluir. O código completo está a seguir.

 

try

{

    string sql = "INSERT INTO Products (ProductName, UnitPrice, UnitsInStock, CategoryID) values (@nome, @preco, @estoque, @categoria)";

 

    using (SqlConnection conn = new SqlConnection(conexao))

    {

        conn.Open();

 

        using (SqlCommand cmd = new SqlCommand(sql, conn))

        {

            Random rnd = new Random();

            int numero = rnd.Next(200, 500);

 

            // valores do produto

            cmd.Parameters.AddWithValue("@nome", "Produto" + numero);

            cmd.Parameters.AddWithValue("@preco", numero);

            cmd.Parameters.AddWithValue("@estoque", numero);

            cmd.Parameters.AddWithValue("@categoria", 1);

 

            cmd.ExecuteNonQuery();

 

            MessageBox.Show("Produto cadastrado com sucesso");

            button1_Click(null, null);

        }

        conn.Close();

    }

}

catch (Exception)

{

    MessageBox.Show("Ocorreu algum erro no cadastro.");

}

 

Veja como é a instrução T-SQL para inclusão. Você deve declarar o INSERT INTO (inclua na tabela) Products (Produtos), seguido da lista de campos da entidade, values (valores) seguido da lista de parâmetros a serem declarados depois.

 

    string sql = "INSERT INTO Products (ProductName, UnitPrice, UnitsInStock, CategoryID) values (@nome, @preco, @estoque, @categoria)";

 

Aqui eu acabei usando um truque, um artificio para gerar um número aleatório que será usado como dado e exemplo. Este número aleatório será gerado entre 200 e 500.

 

Random rnd = new Random();

int numero = rnd.Next(200, 500);

 

A seguir são declarados todos os parâmetros para o nome, preço, estoque e categoria do produto novo. Note que usei o número aleatório gerado para servir como preço, estoque e também no nome do produto, o qual concatenei com a palavra Produto gerando por exemplo Produto234, Produto123, etc.

 

// valores do produto

cmd.Parameters.AddWithValue("@nome", "Produto" + numero);

cmd.Parameters.AddWithValue("@preco", numero);

cmd.Parameters.AddWithValue("@estoque", numero);

cmd.Parameters.AddWithValue("@categoria", 1);

 

cmd.ExecuteNonQuery();

 

 

Veja um exemplo de dois novos produtos cadastrados.

 

Sobre o Autor

Renato Haddad (rehaddad@msn.com  – www.renatohaddad.com ) é MVP, MCT, MCPD e MCTS, palestrante em eventos da Microsoft em diversos países, ministra treinamentos focados em produtividade com o VS.NET 2010, ASP.NET 4, Entity Framework, Reporting Services e Windows Phone. Visite o blog http://weblogs.asp.net/renatohaddad.

 

Tag:

Follow the discussion

  • Oops, something didn't work.

    Getting subscription
    Subscribe to this conversation
    Unsubscribing
    Subscribing
  • first..  brincadeira rsrsrs

     

    Muito bom o tutorial !

    eu ja tinha uma base em Sql e agr com esse tutorial me ajdou bastante !

    valew.

  • BrunoBruno

    Parabéns Renato, muito bom mesmo este tutorial.
    Eu sei bastante coisa de SQL. pois trabalhei com isso.

  • Muito bom,  interessante ver o funcionamento básico de um banco de dados .  

  • AndreiaAndreia

    Parabéns Renato, esse tutorial me ajudou muito para um trabalho da faculdade!Parabéns!

  • wendel tadeuwendel tadeu

    Muito importante o conceito de banco de dados, as estruturas de comunicação com o banco para inserir, alterar, etc...

    Sem contar na codificação dos exemplos, muito show !!
    Aprendi +++++

  • Muito bom o exemplo de relacionamento entre entidades, "uma mulher pode ter diversos homens, e um homem pode ter diversas mulheres."

    Tongue Out

  • Otimo material aprendo muito,,,parabens

  • Bruno CostaBruno Costa

    Ótimo artigo, objetivo e claro!

  • DanivaldoDanivaldo

    Muito bom o tutotiral, bem explicativo e significante para qualquer aprendizado em desenvolvimento

  • Hilton JuniorHilton Junior

    Muito bom, parabéns.

  • Conceito de banco de dados,estruturas e todos os modos de inserir, alterar, etc...

    Sem falar na forma prática e coerente de ensinamentos. Show!!!

  • Poderia transformar este "Products" em class e os exercícios em  métodos só que ao invés de @ parâmetros ser os atributos da class? Creio que sim acho que estou me precipitando vamos assistir os videos... 

  • gilmarciogilmarcio

    na avaliação fala a respeito de executenonquery que não achei no conteudo.

  • GabrielaGabriela

    Ótimo tutorial, me ajudou bastante.

  • FabioFabio

    Rapaz, em Java vi isso como persistência Parabéns.

  • VitorVitor

    Muito boa a explicação... Parabéns

  • FranciscoFrancisco

    Não consegui acompanhar as aulas porque não consegui instalar o banco de dados que baixei. Não encontrei nada que mostrasse passo-a-passo a instalação.

  • LucianoLuciano

    Gostei Muito sobre banco de dados. parabéns para o Renato Haddad.
    como percebi O Sr.Renato Haddad usa muito o programação Código(na programação Objeto), mais você pode usar programação Objeto com comando diretos pelo painel para montar a pagina e assim funciona para o banco de dados. claro você aprende muito mais com o método programação em código direto. como eu notei claro a microsoft usa os software revacinados.mas um bom programado de software web, banco de dados, e programação Objeto não ficar no nestes software.existem bastante opções.

  • Vitor A. Valevitoravale vitoravale

    muito bom

  • ALISSONALISSON

    Muito bom esse artigo, parabens

  • JessykaJessyka

    Ótimo o artigo!!! Aprendi bastante!!
    Muito bom!

  • Matheus SouzaMatheus Souza

    eu não estou conseguindo conectar com o banco de dados, sempre fica dando: Ocorreu algum erro na leitura do banco, eu estou fazendo exatamente igual as video aulas

  • Edvaldo Farias de SantanaEdvaldo Farias de Santana

    Ótima aula, bem fácil de aprende, ainda mais com os videos fica muito simples de aprende conexão!

  • Henrique Clausing CunhaHenrique Clausing Cunha

    "uma mulher pode ter diversos homens, e um homem pode ter diversas mulheres."

    kkkkkkkkkk... prefiro que seja Um-Para-Um!! kkkk.. to rindo muito com isso!!...

  • VandersonVanderson

    Caramba dificil ver um tutorial assim..
    Obrigado ae.

  • Muito bom!

  • Muito bom, parabéns.

  • Thiago RodriguesThiago Rodrigues

    Parabéns. Otima explicação!

  • EmersonEmerson

    Ótimo, prático e objetivo.

  • DanielDaniel

    Muito Bom, Parabéns.

  • JorgeJorge

    Muito bom.

  • DouglasDouglas

    Adorei, parabéns!!!

  • Guilherme LopesGuilherme Lopes

    Engraçado que pequenos detalhes nos surpreendem, mesmo tendo 8 anos de programação na plataforma Microsoft.

  • DiegoDiego

    Bom conteúdo para o pessoal que está na faculdade.

  • renilce queiroz pereirarenilce queiroz pereira

    tô tentando aprender...

  • EdmilsonEdmilson

    Ok. É isso ai. Simples e eficiente.

  • AugustoAugusto

    Muito bom...

  • AnselmoAnselmo

    Muito legal o tutorial !

  • TalissonTalisson

    Muito Bom!

  • Rafael CostaRafael Costa

    Muito bom !

  • Thais SoaresThais Soares

    Muito Bom Parabéns =)

  • Esdras Bezerra da SilvaEsdras Bezerra da Silva

    Direto e objetivo, ótima postagem.

  • WillianWillian

    Muito bom o tutorial Renato, parabéns!

  • Thiago BeckerThiago Becker

    Bem interessante, mas acredito ter encontrado um pequeno erro, na declaração da conexão, é nomeada com conexao, e no restante do código é tratada como conn
    ...
    using (SqlConnection conn = new SqlConnection(conexao))
    ...
    conn.Open();
    ...

    Isso do segundo exemplo em diante.

  • Thiago BeckerThiago Becker

    Falha Minha, esqueça a mensagem anterior!

  • AllanAllan

    muito bom simples e prático parabéns

  • Victor OliveiraVictor Oliveira

    Ótimo

  • Haroldo VinenteHaroldo Vinente

    Muito bom só relembrando!

  • Jose Carlos da SilvaJose Carlos da Silva

    Muito boa postagem. Banco de Dados

  • Fernando CruzFernando Cruz

    Show de bola, ótimo tutorial. Parabéns !!!

  • UlissesUlisses

    Muito bom o conteúdo. Aprendi mais.

  • Lair PereiraLair Pereira

    Boa noite, Renato não tenho experiência nenhuma em programação e tenho uma vaga noção de banco de dados em especial no uso do MS Access; ao ver as suas explicações e claro que tudo parece muito complicado para mim, porém eu gostaria de elaborar um sistema de controle de efetivo, já tenho um banco feito de maneira simples no Access sem uso de códigos, não tenho recursos para pagar um curso e então descobri essa possibilidade da Microsoft virtual academia. Gostaria de fazer uma pergunta, com esses fundamentos em desenvolvimento você acredita que eu consiga elaborar o meus sistema?
    Sou Sd do Corpo de Bombeiros e trabalho em Orlândia, meu banco serve para controlar os dados de efetivo, tenho outras idéias como um controle de estoque de materiais com várias funcionalidades que não encontra-se em sistemas no mercado a não ser o quando personalizado.
    Suas explicações são excelentes, mas acredito que para eu aprender falta algo mais, ou mais noções sobre o assunto, fico perdido quando penso em utilizar por exemplo sql.
    Obrigado e até mais.

  • Cleyton LeiteCleyton Leite

    bom

Remove this comment

Remove this thread

Close

Comments closed

Comments have been closed since this content was published more than 30 days ago, but if you'd like to continue the conversation, please create a new thread in our Forums, or Contact Us and let us know.