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 + "','" + _
                     
txtEstado.Text + "','" + txtCep.Text + "','" + txtTelefone.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;");

    mySqlConnection.Open();

    
SqlCommand sqlCmd = mySqlConnection.CreateCommand();

    sqlCmd.CommandText = "INSERT INTO Clientes (" +
                         "  nome,endereco, cidade, estado, cep, telefone" +
                         ") VALUES (" +
                         "  @nome, @endereco, @cidade, @estado, @cep, @telefone" +
                         ")";

    sqlCmd.Parameters.Add("@nome", SqlDbType.NVarChar, 50);
    sqlCmd.Parameters.Add("@endereco", SqlDbType.NVarChar, 50);
    sqlCmd.Parameters.Add("@cidade", SqlDbType.NVarChar, 50);
    sqlCmd.Parameters.Add("@estado", SqlDbType.NVarChar, 50);
    sqlCmd.Parameters.Add("@cep", SqlDbType.NVarChar, 50);
    sqlCmd.Parameters.Add("@telefone", SqlDbType.NVarChar, 50);

    sqlCmd.Parameters["@nome"].Value = txtNome.Text;
    sqlCmd.Parameters["@endereco"].Value = txtEndereco.Text;
    sqlCmd.Parameters["@cidade"].IsNullable = txtCidade.Text;
    sqlCmd.Parameters["@estado"].Value = txtEstado.Text;
    sqlCmd.Parameters["@cep"].Value = txtCep.Text;
    sqlCmd.Parameters["@telefone"].Value = txtTelefone.Text;

    sqlCmd.ExecuteNonQuery();
    
    mySqlConnection.Close();
 

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:


José Carlos Macoratti