Вы находитесь на странице: 1из 29

1 Acessando BD com C# usando o MySQL

ACESSANDO BD COM C# USANDO O MYSQL


O Visual Studio pode fazer conexo com muitos gerenciadores de Banco de Dados. Por exemplo: Access, SQLServer, MySQL, Oracle, SysBase, entre outros. No nosso caso iremos trabalhar com o MySQl, gerenciador de Banco de Dados gratuito que est disponvel no site www.mysql.com. Para criarmos um programa que armazene, pesquise, exclua e altere informaes em um banco de dados do tipo MySQL, devemos seguir os seguintes passos: 1. Pegar a DLL de conexo do MySQL 2. Criar o banco de dados com suas tabelas no MySQL 3. Criar o programa no C# 1 - PEGAR A DLL DE CONEXO DO MYSQL Para usarmos o Gerenciador de Banco de Dados MySQL, vamos precisar de uma biblioteca para estabelecer a comunicao. Esta biblioteca tambm disponvel no site www.mysql.com.

Profa. Ana Paula Citro Fujarra Rodrigues

2 Acessando BD com C# usando o MySQL

Profa. Ana Paula Citro Fujarra Rodrigues

3 Acessando BD com C# usando o MySQL

Salve o arquivo nos Meus Documentos. Agora vamos descompactar o arquivo para usarmos o arquivo MySql.Data.dll que est dentro da pasta bin. Este o arquivo responsvel em estabelecer a comunicao entre a programao em C# com o banco de dados em MySQL. Portanto deixe este arquivo sempre dentre da pasta do projeto.

2 - CRIAR O BANCO DE DADOS E SUAS TABELAS NO MYSQL Abra o prompt de Comando e digite:

Profa. Ana Paula Citro Fujarra Rodrigues

4 Acessando BD com C# usando o MySQL

3 - CRIAR UM PROGRAMA NO C# Agora iremos criar um projeto e adicionaremos a referncia da DLL usando o arquivo MySql.Data.dll. Inicialize o VisualStudio 2005 e siga os passos: 1. Passo: Criar um projeto

Clique no Menu File

Clique no SubItem New e depois clique em Project

Profa. Ana Paula Citro Fujarra Rodrigues

5 Acessando BD com C# usando o MySQL

Escolha WINDOWS APPLICATION

Escolha um diretrio

Troque o nome para Cadastrar

Clique OK
2. Passo: Adicionar a Referncia Abra o Solution Explorer

Na aba Browse localize o arquivo MySql.Data.dll

Profa. Ana Paula Citro Fujarra Rodrigues

6 Acessando BD com C# usando o MySQL 3. Passo: Criar uma classe para fazer a conexo com o banco de dados (MySQL). A idia de criar uma classe para reutilizarmos o cdigo de conexo e acesso ao banco de dados e suas tabelas, isto , ao invs de copiarmos e colarmos os cdigos de FORM em FORM. Para criarmos uma classe siga os passos abaixo: 1. Passo:

A figura abaixo o cdigo da classe criada, lembrem-se classes no possuem FORM, elas so formadas somente por cdigo.

Profa. Ana Paula Citro Fujarra Rodrigues

7 Acessando BD com C# usando o MySQL

2. Passo: Fazer uso da DLL inserida nas Referencias.

3. Passo: Criar as variveis abaixo:

Observe que esta linha no ficou com o tipo de varivel DataTable em verde, isto significa que est faltando o uso de sua DLL

Profa. Ana Paula Citro Fujarra Rodrigues

8 Acessando BD com C# usando o MySQL Antes de arrumarmos o erro do uso da DLL, vamos entender para que serve cada varivel. A varivel conectar ir armazenar todo o caminho da conexo at o banco de dados. Imagine esta varivel como uma ponte que liga o C# ao MySQL, sem esta ponte no temos caminho para trafegar os comandos em SQL. A varivel comando_sql ir armazenar os comandos da linguagem SQL (insert, delete, select, delete), para serem executados pela varivel executar_comando. Imagine este comando como sendo o prompt de comando com o MySQL aberto. A varivel tabela_memoria ir armazenar o resultado da execuo do comando SQL. Estas 4 variveis sempre iram trabalhar em conjunto 4. Passo: Corrigir o erro da DLL do DataTable

5. Passo: Criar os campos Encapsulados das variveis. . Esta palavra significa que Observe que usamos antes de cada varivel a palavra as variveis no estaro disponveis em outro lugar, a no ser dentro deste cdigo. Ento o que iremos fazer, pois precisarei usar este cdigo em outros FORMS. A soluo criar os campos encapsulados, que iram permitir o uso destas variveis em qualquer outro FORM dentro do projeto. Estes campos encapsulados so criados automaticamente pelo Visual Studio. s seguir os passos abaixo para cada varivel.

Profa. Ana Paula Citro Fujarra Rodrigues

9 Acessando BD com C# usando o MySQL

Profa. Ana Paula Citro Fujarra Rodrigues

10 Acessando BD com C# usando o MySQL

Selecione cada uma das outras 3 variveis e refaa os passos para ter um cdigo semelhante ao cdigo abaixo:

Profa. Ana Paula Citro Fujarra Rodrigues

11 Acessando BD com C# usando o MySQL 6. Passo: Criar a ponte de conexo ao BD do Mysql Observe o final do seu cdigo para adicionar o mtodo no lugar correto.

public String criar_Conexao() { // verificando se existe uma conexo, fecha esta conexo if (conectar != null) { conectar.Close(); } // serve para configurar os parametros do banco de dados string configuracao = string.Format("server={0};user id={1}; password={2}; database=mysql; pooling=false","", "", ""); // tenta estabelecer conectar try { conectar = new MySqlConnection(configuracao); conectar.Open(); }// caso no consiga exibe erro de conexo catch (MySqlException erro) { return ("Erro ao conectar " + erro); } // criar um banco em branco na memria MySqlDataReader banco = null; // fazer uso do banco escolhido MySqlCommand usar = new MySqlCommand("use escola", conectar); // tenta criar o banco try { banco = usar.ExecuteReader(); }// caso ocorra erro catch (MySqlException erro) { return ("Failed to populate database list: " + erro); }// no fim fecha finally { if (banco != null) { banco.Close(); } } return ("Conexo OK!!!"); }

Profa. Ana Paula Citro Fujarra Rodrigues

12 Acessando BD com C# usando o MySQL 7. Passo: Criar o Mtodo acessar tabelas. Desa o cdigo e debaixo para cima observe novamente os trs ltimos fecha chaves ( ). Entre o segundo e o terceiro o lugar correto para escrevermos este cdigo.
public void carregar_tabela(String comando) { tabela_memoria = new DataTable(); comando_sql = new MySqlDataAdapter(comando, conectar); executar_comando = new MySqlCommandBuilder(comando_sql); comando_sql.Fill(tabela_memoria); }

4. Passo: Agora que terminamos nossa classe vamos construir o FORM

Altere o name dos objetos para: LABEL1: lblNome e TEXTBOX1: txtNome LABEL2: lblIdade e TEXTBOX2: txtIdade LABEL3: lblTurma e TEXTBOX3: txtTurma BUTTON1: btnCadastrar DATAGRIDVIEW1: dtgrdExibir FORM1: frmTelaPrincipal

5. PASSO: Vamos comear nossa programao de acesso a tabela 1. Passo: Iremos criar uma varivel global, que na verdade um objeto, cpia da classe Conexo. atravs desta varivel que iremos fazer todo o acesso as tabelas do banco de dados.

Profa. Ana Paula Citro Fujarra Rodrigues

13 Acessando BD com C# usando o MySQL

2. Passo: Ativar o evento LOAD do frmTelaPrincipal (FORM)

3. Passo: Ativar o evento CLICK do btnCadastrar


private void btnCadastrar_Click(object sender, EventArgs e) { con1.carregar_tabela("insert into alunos values('" + txtNome.Text + "'," + txtIdade.Text + ",'" + txtTurma.Text + "')"); con1.carregar_tabela("select * from alunos"); dtgrdExibir.DataSource = con1.Tabela_memoria; }

Profa. Ana Paula Citro Fujarra Rodrigues

14 Acessando BD com C# usando o MySQL

Cadastrando Dados
Reviso
Como foi visto na aula anterior para cadastrar dados em tabelas no MySql preciso saber o comando em SQL (INSERT) e escrever o comando, lembrando que:

Os campos VARCHAR precisam de aspas simples () e os campos INT no

precisam destas aspas simples, conforme o exemplo:


create table alunos ( nome varchar(40), idade int );

insert into alunos values (+txtNome.Text+,+txtIdade.Text+)

Tambm vimos que para cadastrar campos AUTOINCREMENTO necessrio usar as aspas simples com nenhum valor dentro, isto , vazia, conforme o exemplo abaixo:
create table alunos ( cod_aluno int auto_increment, nome varchar(40), idade int,

primary key(cod_aluno) );

insert into alunos values (,+txtNome.Text+,+txtIdade.Text+)

Profa. Ana Paula Citro Fujarra Rodrigues

15 Acessando BD com C# usando o MySQL

Cadastrar Campos FLOAT ou DECIMAL


Para cadastrar campos com casas decimais teremos um problema. Os valores com casas decimais so separados por vrgula

(,) para os softwares padro Windows e para o MySQL as

casas decimais devem ser separadas por ponto (.). Ento teremos que usar um comando especfico para fazer esta converso em cada campo que houver a necessidade. Este comando o Replace(valor original,valor para substituio) e pode ser usado em campo valor String, conforme o exemplo abaixo:
create table funcionario ( cod_func int auto_increment, nome varchar(40), salario float,

primary key(cod_func) );

insert into funcionario values (,+txtNome.Text+,+txtSalario.Text.Replace(,,.)+)

Profa. Ana Paula Citro Fujarra Rodrigues

16 Acessando BD com C# usando o MySQL

Cadastrar Campos NOT NULL


Para os campos NOT NULL no iremos usar comando SQL, mas sim lgica de programao, isto , antes de efetuarmos a linha de comando que faz o insert no banco iremos verificar se os TEXTBOX dos campos NOT NULL foram preenchidos pelo usurio, para isso iremos usar o comando IF/ELSE. Observe o exemplo abaixo:

Verifica se os campos NOT NULL (da tabela funcionario) no foram preenchidos, iguais de vazio (== ). Observe que usamos o OR (||), pois o usurio pode ter preenchido um dos dois campos ou nenhum dos dois. Caso o if seja verdadeiro uma mensagem na tela ir aparecer, informando o usurio que os campos devem ser preenchidos, caso contrrio o cadastro ser efetuado.

Para exemplificar e desmonstrar o cadastro dos campos NOT NULL e FLOAT iremos trabalhar com o projeto disponvel no NetStudent com o nome Escola.

Profa. Ana Paula Citro Fujarra Rodrigues

17 Acessando BD com C# usando o MySQL

Pesquisando Dados
Usando o projeto Escola vamos codificar o boto Pesquisar.

Lembre-se quando efetuamos uma Pesquisa precisamos de um valor de busca, por exemplo Nome do Funcionrio, e aps encontrar o valor procurado, na tabela, devemos exibir todos os outros campos da tabela, por este motivo precisamos de LABELS para exibir o resultado.

VALOR DE BUSCA Boto para executar o comando SELECT (busca)

LABELS para exibir o resultado da busca Clique 2x no boto Pesquisar e escreva o cdigo abaixo:
private void btnPesquisar_Click(object sender, EventArgs e) { con1.carregar_tabela("select * from funcionario where nome='"+txtNomePesq.Text+"'"); if (con1.Tabela_memoria.Rows.Count == 0) { MessageBox.Show("Funcionario no encontrado!!!!"); } else { lblRespNome.Text = con1.Tabela_memoria.Rows[0]["nome"].ToString(); lblRespSalario.Text = con1.Tabela_memoria.Rows[0]["salario"].ToString(); } }

Profa. Ana Paula Citro Fujarra Rodrigues

18 Acessando BD com C# usando o MySQL Observe como fica a varivel Tabela_memoria aps uma consulta que no foram encontrados resultados, isto , o valor informado para a busca no existe na tabela.

Sem nenhuma informao, verificando ZERO linha, isto , quantidade de linha igual a ZERO.

PORTANTO O COMANDO QUE SER EXECUTADO O IF ABAIXO

INFORMANDO QUE O VALOR INFORMADO NO EXISTE NA TABELA Observe agora como fica a varivel Tabela_memoria aps uma consulta aonde encontrado APENAS UM resultado, isto , o valor informado para a busca existe na tabela.

Com uma informao, verificando UMA linha, isto , quantidade de linha diferente de ZERO.

PORTANTO O COMANDO QUE SER EXECUTADO O ELSE ABAIXO

EXIBINDO O VALOR ENCONTRADO NOS LABELS.

Profa. Ana Paula Citro Fujarra Rodrigues

19 Acessando BD com C# usando o MySQL ENTENDA O COMANDO :

PARA EXIBIR USAMOS O VALOR ENCONTRADO NA LINHA ZERO SEU NOME NA TABELA , FORMANDO O COMANDO

EO

A CONVERSO PARA STRING OBRIGATRIA PARA PODERMOS EXIBIR OS VALORES ENCONTRADOS EM LABELS OU TEXTBOXS. Observe agora como fica a varivel Tabela_memoria aps uma consulta aonde so encontrados VRIOS resultados, isto , o valor informado para a busca existe na tabela.

Com vrias informaes, verificamos VRIAS linhas, isto , quantidade de linha diferente de ZERO. Mas temos um grande problema, como exibir todos os valores se SEMPRE usamos o comando E AGORA? .

SOLUO PARA O PROBLEMA DE VRIOS REGISTROS Exibir e o resultado da busca em LABELS e em um DATAGRIDVIEW, como fazemos com o cadastro. Observe o cdigo abaixo:

Profa. Ana Paula Citro Fujarra Rodrigues

20 Acessando BD com C# usando o MySQL

Observe que usamos o DATAGRIDVIEW do cadastro, somente para exemplificar a soluo.

Profa. Ana Paula Citro Fujarra Rodrigues

21 Acessando BD com C# usando o MySQL

Excluindo Dados
Quando analisamos o processo de excluso de registros observamos que necessrio fazer uma pesquisa antes de excluir o registro para verificarmos se a informao encontrada de fato a que desejamos excluir. Altere o FORM, adicionando o boto Excluir, conforme segue abaixo:

Profa. Ana Paula Citro Fujarra Rodrigues

22 Acessando BD com C# usando o MySQL

Lembre-se que o boto excluir deve se acionado somente depois que pesquisamos uma informao.
Clique 2x no boto Excluir e escreva o cdigo abaixo:
private void btnExcluir_Click(object sender, EventArgs e) { DialogResult resp; resp = MessageBox.Show("Deseja excluir este registro?","Excluir!!!",MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (resp == DialogResult.Yes) { con1.carregar_tabela("delete from funcionario where nome='"+txtNomePesq.Text+"'"); MessageBox.Show("Funcionrio excludo com sucesso!!!!"); } else { MessageBox.Show("Excluso cancelada!!!!"); } }

O processo de excluso dever seguir os passos: 1. Digite a informao desejada e click no boto Pesquisar, todos os dados referente a esta informao sero exibidos no labels da pesquisa. 2. Click no boto Excluir, para evitar o erro de excluirmos informaes que no desejamos, adicionamos a caixa de mensagem abaixo:

resp = MessageBox.Show("Deseja excluir este registro?","Excluir!!!",MessageBoxButtons.YesNo , MessageBoxIcon.Question);

3. A resposta do usurio (click no boto) ser armazenado na variavel resp. Se a resposta for SIM a informao ser excluda da tabela e caso seja NO a informao no ser excluda.

Profa. Ana Paula Citro Fujarra Rodrigues

23 Acessando BD com C# usando o MySQL

Alterando Dados
Idem ao processo de excluso a alterao de dados tambm precisa da pesquisa. Portanto iremos usar o mesmo FORM, mas no podemos esquecer que para alterar informaes precisamos digitar e para isto teremos que usar TEXTBOX para exibir o resultado da Pesquisa ao invs de LABELS. Primeiro iremos alterar o FORM, trocando os LABELS por TEXTBOXS e adicionando o boto Alterar, conforme segue abaixo:

Agora iremos alterar o cdigo do boto Pesquisar que exibia as informaes em LABELS e agora dever exibir as informaes em TEXTBOXS.

Profa. Ana Paula Citro Fujarra Rodrigues

24 Acessando BD com C# usando o MySQL Portanto iremos fazer o cdigo do boto Alterar. Clique 2x no boto Alterar e escreva o cdigo abaixo:
private void btnAlterar_Click(object sender, EventArgs e) { con1.carregar_tabela("update funcionario set nome='"+txtNovoNome.Text+"', salario="+txtNovoSalario.Text+" where nome='"+txtNomePesq.Text+"'"); MessageBox.Show("Funcionrio alterado com sucesso!!!!"); }

Lembre-se que o boto alterar deve se acionado somente depois que pesquisamos uma informao.

Profa. Ana Paula Citro Fujarra Rodrigues

25 Acessando BD com C# usando o MySQL

Trabalhando com Foreign Key


Usando o projeto Exemplo 4TINA para exemplificarmos a processo de cadastro e pesquisa de FK (Foreign Key) nas tabelas. O FORM principal tem o layout abaixo:

Observando a FORM e o banco de dados verificamos que os DADOS DO PRODUTO esto cadastrados na tabela PRODUTO e os DADOS DO VENDEDOR esto cadastrados na tabela VENDEDOR, caracterizando um FK Tambm verificamos que o VALOR A RECEBER do vendedor ser calculado automaticamente atravs do TOTAL DA VENDA, que tambm ser calculado automaticamente atravs da QUANTIDADE COMPRADA * PREO UNITRIO. Iremos comear carregando os COMBOBOXS com as respectivas tabelas. 1 - Acione o evento LOAD do FORM e escreva o cdigo abaixo:
private void Form1_Load(object sender, EventArgs e) { MessageBox.Show(con1.criar_Conexao()); con1.carregarTabela("select * from produto"); cmbProduto.DataSource = con1.Tabela_memoria; cmbProduto.DisplayMember = "descricao"; cmbProduto.ValueMember = "cod_produto"; con1.carregarTabela("select * from vendedor"); cmbVendedor.DataSource = con1.Tabela_memoria; cmbVendedor.DisplayMember = "nome"; cmbVendedor.ValueMember = "cod_vendedor"; }

Profa. Ana Paula Citro Fujarra Rodrigues

26 Acessando BD com C# usando o MySQL Observe que a linha , a que cria a conexo com o banco, deve ser sempre a primeira linha do evento LOAD do FORM, porque sem conexo ao banco no conseguimos fazer nada com as tabelas. Agora vamos entender como funciona o preenchimento dos COMBOBOXS com os valores que esto nas tabelas. 1. Devemos fazer uma busca de todas as informaes da tabela que desejamos exibir no COMBOBOX, isto feito com a linha

2. Depois de termos todos os dados carregados iremos atribuir estes valores ao COMBOBOX, isto feito com a linha

3. Agora temos um COMBOBOX com todas as informaes da TABELA, portanto devemos escolher qual destes campos (informaes) ser exibido ao usurio. Lembre-se que neste momento a informao deve ser o nome do CAMPO da TABELA. Isto feita com a linha 4. Como o COMBOBOX est representando um FK, devemos informar qual ser a informao capturado com a seleo do usurio. Neste caso iremos exibir o DESCRICAO e vamos capturar com a seleo do usurio a COD_PRODUTO. Isto feito com a linha

2 -

Com os COMBOBOX carregados, iremos preencher os campos referentes com a seleo do usurio. Para isto devemos acionar o evento

automaticamente

SELECTEDINDEXCHANGED dos COMBOBOXS. Para isto click 2x no COMBOBOX do PRODUTO e escreva o cdigo abaixo:
private void cmbProduto_SelectedIndexChanged(object sender, EventArgs e) { try { con1.carregarTabela("select * from produto where descricao ='"+cmbProduto.Text+"'"); txtPrecoUnit.Text = con1.Tabela_memoria.Rows[0]["preco"].ToString(); txtQtdEstoque.Text = con1.Tabela_memoria.Rows[0]["qtd_estoque"].ToString(); } catch { } }

Profa. Ana Paula Citro Fujarra Rodrigues

27 Acessando BD com C# usando o MySQL Agora click 2x no COMBOBOX do VENDEDOR e escreva o cdigo abaixo:
private void cmbVendedor_SelectedIndexChanged(object sender, EventArgs e) { try { con1.carregarTabela("select * from vendedor where nome ='" + cmbVendedor.Text + "'"); txtComissao.Text = con1.Tabela_memoria.Rows[0]["comissao"].ToString(); } catch { } }

Os cdigo acima tem a funcionalidade de ao selecionar um item no COMBOBOX o outros valores armazenados na tabela sejam exibidos automaticamente. Lembre-se no obrigatrio exibir todos os valores da tabela, exibimos aquilo que desejamos, isto , aquilo que necessrio para que o usurio entenda o software.

3 - Agora iremos calcular o total de venda, para isto acione o evento TEXTCHANGED do txtQtdComprada, clicando 2x no txtQtdComprada, e escreva o cdigo abaixo:
private void txtQtdComprada_TextChanged(object sender, EventArgs e) { if (txtQtdComprada.Text != "") { qtd_comprada = Convert.ToInt32(txtQtdComprada.Text); qtd_estoque = Convert.ToInt32(txtQtdEstoque.Text); preco = Convert.ToInt32(txtPrecoUnit.Text); if (qtd_comprada <= qtd_estoque) { total_venda = preco * qtd_comprada; txtTotalVenda.Text = total_venda.ToString(); } else { MessageBox.Show("Quantidade Insuficiente no Estoque!!!"); } } }

As variveis usadas neste cdigo foram declaradas como variveis globais conforme a figura abaixo:

Profa. Ana Paula Citro Fujarra Rodrigues

28 Acessando BD com C# usando o MySQL 4 Agora iremos calcular a comisso do vendedor. Iremos fazer este calculo em conjunto com o total da venda, pois para a comisso do vendedor precisamos do total da venda e ela tambm deve ser calculada automaticamente. Clique 2x no txtQtdComprada e altere o cdigo para:

5 Finalmente iremos fazer o boto cadastrar. No cadastrar iremos cadastrar os dados da tabela VENDAS e decrementarmos a qtd_estoque da tabela PRODUTO. Como a tabela VENDAS tem dois FK, os valores cadastrados nestes campos deve ser um valor INTEIRO e no um TEXTO como exibido no COMBOBOX, portanto quando tivermos FK em tabelas e usarmos . Clique 2x no btnCadastrar e escreva o cdigo abaixo: o COMBOBOX iremos usar o seguinte comando

Profa. Ana Paula Citro Fujarra Rodrigues

29 Acessando BD com C# usando o MySQL


private void btnCadastrar_Click(object sender, EventArgs e) { DateTime data_venda; data_venda = Convert.ToDateTime(mskDataCompra.Text); String data; data = data_venda.ToString("yyyy/MM/dd"); if (cmbProduto.Text == "" || cmbVendedor.Text == "" || txtNomeCliente.Text == "" || mskDataCompra.Text == " / /") { MessageBox.Show("Preencha todos os campos!!"); } else { con1.carregarTabela("insert into vendas values('','" + txtNomeCliente.Text + "'," + cmbProduto.SelectedValue + "," + cmbVendedor.SelectedValue+ "," + txtTotalVenda.Text.Replace(',','.') + ",'"+data+"')"); con1.carregarTabela("update produto set qtd_estoque = qtd_estoque "+txtQtdComprada.Text+" where descricao='"+cmbProduto.Text+"'"); MessageBox.Show("Cadastro efetuado com sucesso!"); } }

Precisamos usar a converso de datas pois o MYSQL usa o padro aaaa/mm/dd, sendo aaaa para o ano com 4 algarismos, mm para o ms com 2 algarismos e dd para o dia com 2 algarismos, e ns usamos o padro inverso dd/mm/aaaa. O cdigo abaixo o responsvel em fazer esta converso.
DateTime data_venda; data_venda = Convert.ToDateTime(mskDataCompra.Text); String data; data = data_venda.ToString("yyyy/MM/dd");

Profa. Ana Paula Citro Fujarra Rodrigues