Upload
fernando-hardt
View
162
Download
9
Embed Size (px)
Citation preview
1 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
ACESSANDO BD COM C# USANDO O MYSQL
O Visual Studio pode fazer conexão 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á disponível no site www.mysql.com. Para criarmos um programa que armazene, pesquise, exclua e altere informações em um banco de dados do tipo MySQL, devemos seguir os seguintes passos:
1. Pegar a DLL de conexão do MySQL 2. Criar o banco de dados com suas tabelas no MySQL 3. Criar o programa no C#
1 - PEGAR A DLL DE CONEXÃO DO MYSQL
Para usarmos o Gerenciador de Banco de Dados MySQL, vamos precisar de uma biblioteca
para estabelecer a comunicação. Esta biblioteca também disponível no site www.mysql.com.
2 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
3 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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 responsável em estabelecer a comunicação entre a programação 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:
4 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
3 - CRIAR UM PROGRAMA NO C#
Agora iremos criar um projeto e adicionaremos a referência 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
5 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
2. Passo: Adicionar a Referência
Troque o nome para Cadastrar
Escolha WINDOWSAPPLICATION
Escolha um diretório
Clique OK
Abra o Solution Explorer
Na aba Browse localize o arquivo MySql.Data.dll
6 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
3. Passo: Criar uma classe para fazer a conexão com o banco de dados (MySQL). A idéia de criar uma classe é para reutilizarmos o código de conexão e acesso ao banco de dados e suas tabelas, isto é, ao invés de copiarmos e colarmos os códigos de FORM em FORM. Para criarmos uma classe siga os passos abaixo: 1. Passo:
A figura abaixo é o código da classe criada, lembrem-se classes não possuem FORM, elas são formadas somente por código.
7 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
2. Passo: Fazer uso da DLL inserida nas Referencias.
3. Passo: Criar as variáveis abaixo:
Observe que esta linha não ficou com o tipo de variável DataTable em verde, isto significa que está faltando o uso de sua DLL
8 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Antes de arrumarmos o erro do uso da DLL, vamos entender para que serve cada variável. A variável conectar irá armazenar todo o caminho da conexão até o banco de dados. Imagine esta variável como uma ponte que liga o C# ao MySQL, sem esta “ponte” não temos caminho para trafegar os comandos em SQL. A variável comando_sql irá armazenar os comandos da linguagem SQL (insert, delete, select, delete), para serem executados pela variável executar_comando. Imagine este comando como sendo o prompt de comando com o MySQL aberto. A variável tabela_memoria irá armazenar o resultado da execução do comando SQL. Estas 4 variáveis sempre iram trabalhar em conjunto 4. Passo: Corrigir o erro da DLL do DataTable 5. Passo: Criar os campos Encapsulados das variáveis. Observe que usamos antes de cada variável a palavra . Esta palavra significa que as variáveis não estarão disponíveis em outro lugar, a não ser dentro deste código. Então o que iremos fazer, pois precisarei usar este código em outros FORMS. A solução é criar os campos encapsulados, que iram permitir o uso destas variáveis em qualquer outro FORM dentro do projeto. Estes campos encapsulados são criados automaticamente pelo Visual Studio. É só seguir os passos abaixo para cada variável.
9 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
10 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Selecione cada uma das outras 3 variáveis e refaça os passos para ter um código semelhante ao código abaixo:
11 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
6. Passo: Criar a “ponte” de conexão ao BD do Mysql Observe o final do seu código para adicionar o método no lugar correto.
public String criar_Conexao() { // verificando se existe uma conexão, fecha esta conexão 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 não consiga exibe erro de conexão catch (MySqlException erro) { return ("Erro ao conectar " + erro); } // criar um banco em branco na memória 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 ("Conexão OK!!!"); }
12 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
7. Passo: Criar o Método acessar tabelas.
Desça o código e debaixo para cima observe novamente os três últimos fecha chaves (}). Entre o segundo e o terceiro é o lugar correto para escrevermos este código. 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
5. PASSO: Vamos começar nossa programação de acesso a tabela 1. Passo: Iremos criar uma variável global, que na verdade é um objeto, cópia da classe Conexão. É através desta variável que iremos fazer todo o acesso as tabelas do banco de dados.
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
13 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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; }
14 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Cadastrando Dados
Revisão
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 não
precisam destas aspas simples, conforme o exemplo:
create table alunos
(
nome varchar(40),
idade int
);
“insert into alunos values (‘”+txtNome.Text+”’,”+txtIdade.Text+”)“
Também vimos que para cadastrar campos AUTOINCREMENTO é necessário 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+”)“
15 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Cadastrar Campos FLOAT ou DECIMAL
Para cadastrar campos com casas decimais teremos um problema. Os valores com casas
decimais são separados por vírgula (,) para os softwares padrão Windows e para o MySQL as
casas decimais devem ser separadas por ponto (.).
Então teremos que usar um comando específico para fazer esta conversão em cada campo
que houver a necessidade.
Este comando é o Replace(‘valor original’,’valor para substituição’) 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(‘,’,’.’)+”)“
16 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Cadastrar Campos NOT NULL
Para os campos NOT NULL não iremos usar comando SQL, mas sim lógica de
programação, 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 usuário, para isso
iremos usar o comando IF/ELSE.
Observe o exemplo abaixo:
Para exemplificar e desmonstrar o cadastro dos campos NOT NULL e FLOAT iremos
trabalhar com o projeto disponível no NetStudent com o nome Escola.
Verifica se os campos NOT NULL (da tabela funcionario) não foram preenchidos, iguais de vazio (== “”). Observe que usamos o OR (||), pois o usuário pode ter preenchido um dos dois campos ou nenhum dos dois. Caso o if seja verdadeiro uma mensagem na tela irá aparecer, informando o usuário que os campos devem ser preenchidos, caso contrário o cadastro será efetuado.
17 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Pesquisando Dados
Usando o projeto Escola vamos codificar o botão Pesquisar.
Lembre-se quando efetuamos uma Pesquisa precisamos de um valor de busca, por
exemplo Nome do Funcionário, e após encontrar o valor procurado, na tabela, devemos exibir todos
os outros campos da tabela, por este motivo precisamos de LABELS para exibir o resultado.
Clique 2x no botão Pesquisar e escreva o código 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 não encontrado!!!!"); } else { lblRespNome.Text = con1.Tabela_memoria.Rows[0]["nome"].ToString(); lblRespSalario.Text = con1.Tabela_memoria.Rows[0]["salario"].ToString(); } }
VALOR DE BUSCA
LABELS para exibir o resultado da busca
Botão para executar o comando SELECT (busca)
18 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Observe como fica a variável Tabela_memoria após uma consulta que não foram
encontrados resultados, isto é, o valor informado para a busca não existe na tabela.
Observe agora como fica a variável Tabela_memoria após uma consulta aonde é
encontrado APENAS UM resultado, isto é, o valor informado para a busca existe na tabela.
Sem nenhuma informação, verificando ZERO linha, isto é, quantidade de linha igual a ZERO.
Com uma informação, verificando UMA linha, isto é, quantidade de linha diferente de ZERO.
PORTANTO O COMANDO QUE SERÁ EXECUTADO É O IF ABAIXO
INFORMANDO QUE O VALOR INFORMADO NÃO EXISTE NA TABELA
PORTANTO O COMANDO QUE SERÁ EXECUTADO É O ELSE ABAIXO
EXIBINDO O VALOR ENCONTRADO NOS LABELS.
19 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
ENTENDA O COMANDO :
Observe agora como fica a variável Tabela_memoria após uma consulta aonde são
encontrados VÁRIOS resultados, isto é, o valor informado para a busca existe na tabela.
SOLUÇÃO PARA O PROBLEMA DE VÁRIOS REGISTROS
Exibir e o resultado da busca em LABELS e em um DATAGRIDVIEW, como fazemos
com o cadastro. Observe o código abaixo:
Com várias informações, verificamos VÁRIAS 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?
PARA EXIBIR USAMOS O VALOR ENCONTRADO NA LINHA ZERO E O SEU NOME NA TABELA , FORMANDO O COMANDO A CONVERSÃO PARA STRING É OBRIGATÓRIA PARA PODERMOS EXIBIR OS VALORES ENCONTRADOS EM LABELS OU TEXTBOXS.
20 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Observe que usamos o DATAGRIDVIEW do cadastro, somente para exemplificar a
solução.
21 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Excluindo Dados Quando analisamos o processo de exclusão de registros observamos que é necessário
fazer uma pesquisa antes de excluir o registro para verificarmos se a informação encontrada é de
fato a que desejamos excluir.
Altere o FORM, adicionando o botão Excluir, conforme segue abaixo:
22 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Lembre-se que o botão excluir deve se acionado somente depois que
pesquisamos uma informação. Clique 2x no botão Excluir e escreva o código 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("Funcionário excluído com sucesso!!!!"); } else { MessageBox.Show("Exclusão cancelada!!!!"); } }
O processo de exclusão deverá seguir os passos:
1. Digite a informação desejada e click no botão Pesquisar, todos os dados referente
a esta informação serão exibidos no labels da pesquisa.
2. Click no botão Excluir, para evitar o erro de excluirmos informações que não
desejamos, adicionamos a caixa de mensagem abaixo:
resp = MessageBox.Show("Deseja excluir este registro?","Excluir!!!",MessageBoxButtons.YesNo, MessageBoxIcon.Question);
3. A resposta do usuário (click no botão) será armazenado na variavel resp. Se a
resposta for SIM a informação será excluída da tabela e caso seja NÃO a
informação não será excluída.
23 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Alterando Dados Idem ao processo de exclusão a alteração de dados também precisa da pesquisa. Portanto
iremos usar o mesmo FORM, mas não podemos esquecer que para alterar informações precisamos
digitar e para isto teremos que usar TEXTBOX para exibir o resultado da Pesquisa ao invés de
LABELS.
Primeiro iremos alterar o FORM, trocando os LABELS por TEXTBOXS e adicionando o
botão Alterar, conforme segue abaixo:
Agora iremos alterar o código do botão Pesquisar que exibia as informações em LABELS
e agora deverá exibir as informações em TEXTBOXS.
24 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Portanto iremos fazer o código do botão Alterar. Clique 2x no botão Alterar e escreva o
código 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("Funcionário alterado com sucesso!!!!"); }
Lembre-se que o botão alterar deve se acionado somente depois que
pesquisamos uma informação.
25 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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
estão cadastrados na tabela PRODUTO e os DADOS DO VENDEDOR estão cadastrados na tabela
VENDEDOR, caracterizando um FK
Também verificamos que o VALOR A RECEBER do vendedor será calculado
automaticamente através do TOTAL DA VENDA, que também será calculado automaticamente
através da QUANTIDADE COMPRADA * PREÇO UNITÁRIO.
Iremos começar carregando os COMBOBOXS com as respectivas tabelas.
1 - Acione o evento LOAD do FORM e escreva o código 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"; }
26 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Observe que a linha , a que cria a
conexão com o banco, deve ser sempre a primeira linha do evento LOAD do FORM, porque sem
conexão ao banco não conseguimos fazer nada com as tabelas.
Agora vamos entender como funciona o preenchimento dos COMBOBOXS com os
valores que estão nas tabelas.
1. Devemos fazer uma busca de todas as informações 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 informações da TABELA, portanto
devemos escolher qual destes campos (informações) será exibido ao usuário. Lembre-se
que neste momento a informação 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
informação capturado com a seleção do usuário. Neste caso iremos exibir o DESCRICAO
e vamos capturar com a seleção do usuário a COD_PRODUTO. Isto é feito com a linha
2 - Com os COMBOBOX carregados, iremos preencher os campos referentes
automaticamente com a seleção do usuário. Para isto devemos acionar o evento
SELECTEDINDEXCHANGED dos COMBOBOXS.
Para isto click 2x no COMBOBOX do PRODUTO e escreva o código 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 { } }
27 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
Agora click 2x no COMBOBOX do VENDEDOR e escreva o código 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 código acima tem a funcionalidade de ao selecionar um item no COMBOBOX o
outros valores armazenados na tabela sejam exibidos automaticamente.
Lembre-se não é obrigatório exibir todos os valores da tabela, exibimos aquilo que
desejamos, isto é, aquilo que é necessário para que o usuário 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 código 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 variáveis usadas neste código foram declaradas como variáveis globais conforme a
figura abaixo:
28 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
4 – Agora iremos calcular a comissão do vendedor. Iremos fazer este calculo em conjunto
com o total da venda, pois para a comissão do vendedor precisamos do total da venda e ela também
deve ser calculada automaticamente.
Clique 2x no txtQtdComprada e altere o código para:
5 – Finalmente iremos fazer o botão 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 não um TEXTO como é exibido no COMBOBOX, portanto quando tivermos FK
em tabelas e usarmos o COMBOBOX iremos usar o seguinte comando
.
Clique 2x no btnCadastrar e escreva o código abaixo:
29 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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 conversão de datas pois o MYSQL usa o padrão aaaa/mm/dd, sendo
aaaa para o ano com 4 algarismos, mm para o mês com 2 algarismos e dd para o dia com 2
algarismos, e nós usamos o padrão inverso dd/mm/aaaa. O código abaixo é o responsável em fazer
esta conversão. DateTime data_venda; data_venda = Convert.ToDateTime(mskDataCompra.Text); String data; data = data_venda.ToString("yyyy/MM/dd");