C# - Criando um projeto de acesso a dados no SharpDevelop - 3
No artigo anterior mostrei como incluir dados em uma tabela de um banco de dados Microsoft Access usando uma instrução SQL INSERT INTO definida da seguinte forma: |
string
strSQL
=
"INSERT INTO Clientes(nome,endereco,cidade,estado,cep,telefone)"
+ "
VALUES ('" + txtNome.Text
+ "','"
+ txtEndereco.Text
+ "','"
+ txtCidade.Text
+ "','"
+ _
txtEstado.Text +
"','" + txtCep.Text
+ "','"
+ txtTelefone.Text
+
"')";
Vamos ser sincero, que código mais feio e sujeito a falhas , não é mesmo ???
Neste código você só vai saber se houver erros em tempo de compilação , não há o recurso do intellisense , e estamos usando uma tabela simples com apenas 6 campos , imagine uma tabela com 10 , 20 campos !!! Ia ser um sacrifício montar a instrução SQL com virgulas, pontos, parênteses, etc...
Pensando nisso vou mostrar como você pode realizar a mesma operação de uma maneira mais eficaz.
Incluindo dados - Usando uma consulta com parâmetros
Vou usar o mesmo projeto e nada será modificado a não ser a rotina para salvar dados. Para lembrar vejamos como é a rotina atual:
private void SalvaDados() { string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb"; string strSQL = "INSERT INTO Clientes(nome,endereco,cidade,estado,cep,telefone)"
+ " VALUES ('" +
txtNome.Text +
"','" +
txtEndereco.Text +
"','" + txtCidade.Text
+ "','"
+ _
//cria a conexão com o banco de dados OleDbConnection dbConnection = new OleDbConnection(strConnection);
//Cria o comando que inicia a query OleDbCommand cmdQry = new OleDbCommand(strSQL, dbConnection); try { // abre o banco dbConnection.Open(); // executa a query cmdQry.ExecuteNonQuery(); // MessageBox.Show("Dados Salvos com sucesso."); } //Trata a exceção catch (OleDbException ex) { MessageBox.Show("Error: " + ex.Message); } finally { //fecha a conexao dbConnection.Close(); } } |
Vou continuar usando a instrução INSERT INTO mas vou usar parâmetros ao invés de digitar diretamente os valores que deverão ser incluídos na tabela.
Veja como deve ficar a nova rotina para Salvar Dados:
private void SalvaDados(){ // define a string de conexão string strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";
//cria a conexão com o banco de dados OleDbConnection dbConnection = new OleDbConnection(strConnection); //cria um comando OleDbCommand cmdQry = dbConnection.CreateCommand();
//Define a instrução SQL com parâmetros cmdQry.CommandText = "INSERT INTO Clientes(nome,endereco,cidade,estado,cep,telefone)"
+ " VALUES (@nome, @endereco,
@cidade, @estado, @cep, @Telefone)"; // definindo os parâmetro: nome , tipo de dados e tamanho cmdQry.Parameters.Add("@nome", OleDbType.VarChar, 50); cmdQry.Parameters.Add("@endereco", OleDbType.VarChar, 50); cmdQry.Parameters.Add("@cidade", OleDbType.VarChar, 50); cmdQry.Parameters.Add("@estado", OleDbType.VarChar, 50); cmdQry.Parameters.Add("@cep", OleDbType.VarChar, 50); cmdQry.Parameters.Add("@telefone",
OleDbType.VarChar,
50);
//atribuindo valores aos parâmetros cmdQry.Parameters["@nome"].Value = txtNome.Text; cmdQry.Parameters["@endereco"].Value = txtEndereco.Text; cmdQry.Parameters["@cidade"].Value = txtCidade.Text; cmdQry.Parameters["@estado"].Value = txtEstado.Text; cmdQry.Parameters["@cep"].Value = txtCep.Text; cmdQry.Parameters["@telefone"].Value = txtTelefone.Text; try{ // abre o banco dbConnection.Open(); // executa a query cmdQry.ExecuteNonQuery(); // MessageBox.Show("Dados Salvos com sucesso."); } //Trata a exceção catch (OleDbException ex) { MessageBox.Show("Error: " + ex.Message); } finally { //fecha a conexao dbConnection.Close(); } } |
O importe a destacar nesta rotina é o seguinte:
Estou definindo uma instrução SQL INSERT INTO de e usando parâmetros.
O
objeto Command da ADO.NET fornece o método ExecuteNonQuery
para executar consultas que não retornam linhas (registros). Apesar de não
retornar registros , qualquer parâmetro de saída ou valores retornados
mapeados para parâmetros do objeto Comando são preenchidos com dados.
O método ExecuteNonQuery retorna o número de linhas afetados pelas operações de Insert , Update e Delete. Para todas as demais consultas o valor retornado é -1. Quando uma consulta falha na execução o provedor gerenciado dispara uma exceção que você pode capturar no seu código. |
//Define a instrução SQL com parâmetros
cmdQry.CommandText = "INSERT INTO Clientes(nome,endereco,cidade,estado,cep,telefone)"+ " VALUES (@nome, @endereco, @cidade, @estado, @cep, @Telefone)";
A seguir efetuo a definição dos parâmetros:
// definindo os parâmetro: nome , tipo de dados e tamanho
cmdQry.Parameters.Add("@nome", OleDbType.VarChar, 50);
cmdQry.Parameters.Add("@endereco", OleDbType.VarChar, 50);
cmdQry.Parameters.Add("@cidade", OleDbType.VarChar, 50);
cmdQry.Parameters.Add("@estado", OleDbType.VarChar, 50);
cmdQry.Parameters.Add("@cep", OleDbType.VarChar, 50);
cmdQry.Parameters.Add("@telefone", OleDbType.VarChar, 50);
A coleção Parameters do
objeto Command é usada para definir os argumentos do procedimento
armazenado ou da consulta parametrizada.
Embora você possa definir um procedimento armazenado e um parâmetro Input como um comando do tipo texto (Command Text), usando a coleção Parameters você simplifica a colocação dos parâmetros no local e formato correto. Os parâmetros do tipo string contendo caracteres aspas são automaticamente formatados. |
E finalmente atribuo os valores do formulário aos parâmetros:
//atribuindo valores aos parâmetros
cmdQry.Parameters["@nome"].Value = txtNome.Text;
cmdQry.Parameters["@endereco"].Value = txtEndereco.Text;
cmdQry.Parameters["@cidade"].Value = txtCidade.Text;
cmdQry.Parameters["@estado"].Value = txtEstado.Text;
cmdQry.Parameters["@cep"].Value = txtCep.Text;
cmdQry.Parameters["@telefone"].Value = txtTelefone.Text;
O código ficou mais organizado e menos sujeito a erros. Se executarmos o projeto para inclusão de novos dados iremos obter o mesmo resultado:
Então para incluir dados em uma tabela fazemos assim:
Pegue o projeto completo aqui: CadastroParameters.zip
No próximo artigo eu lhe mostrarei uma forma mais adequado de incluir dados : Usando uma Stored procedures.
A mesma rotina de inclusão para uma base de dados SQL Server Express chamada Cadastro contendo uma tabela Clientes seria assim:
SqlConnection mySqlConnection =new SqlConnection("server=(local)\\SQLEXPRESS;database=Cadastro;Integrated Security=SSPI;");
|
Acompanhe a continuação deste artigo aqui : C# - Criando um projeto de acesso a dados no SharpDevelop - 4
Até o próximo artigo ...
Veja os
Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique
e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net
.NET - Dicas de site com livros gratuitos para estudo - Macoratti.net