View
84
Download
7
Category
Preview:
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 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.
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 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:
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 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
5 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
2. Passo: Adicionar a Referncia
Troque o nome para Cadastrar
Escolha WINDOWSAPPLICATION
Escolha um diretrio
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 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.
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 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
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 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. Observe que usamos antes de cada varivel a palavra . Esta palavra significa que 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.
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 variveis e refaa os passos para ter um cdigo semelhante ao cdigo abaixo:
11 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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!!!"); }
12 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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
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.
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
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+)
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 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(,,.)+)
16 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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:
Para exemplificar e desmonstrar o cadastro dos campos NOT NULL e FLOAT iremos
trabalhar com o projeto disponvel no NetStudent com o nome Escola.
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.
17 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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.
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(); } }
VALOR DE BUSCA
LABELS para exibir o resultado da busca
Boto para executar o comando SELECT (busca)
18 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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.
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.
Sem nenhuma informao, verificando ZERO linha, isto , quantidade de linha igual a ZERO.
Com uma informao, verificando UMA linha, isto , quantidade de linha diferente de ZERO.
PORTANTO O COMANDO QUE SER EXECUTADO O IF ABAIXO
INFORMANDO QUE O VALOR INFORMADO NO 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 varivel Tabela_memoria aps uma consulta aonde so
encontrados VRIOS resultados, isto , o valor informado para a busca existe na tabela.
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:
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?
PARA EXIBIR USAMOS O VALOR ENCONTRADO NA LINHA ZERO E O SEU NOME NA TABELA , FORMANDO O COMANDO A CONVERSO PARA STRING OBRIGATRIA 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
soluo.
21 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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:
22 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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.
23 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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.
24 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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.
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
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"; }
26 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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
automaticamente com a seleo do usurio. Para isto devemos acionar o evento
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 { } }
27 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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
28 Acessando BD com C#
usando o MySQL
Profa. Ana Paula Citro Fujarra Rodrigues
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 o COMBOBOX iremos usar o seguinte comando
.
Clique 2x no btnCadastrar e escreva o cdigo 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 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");
Recommended