Udocs.me

Aplicativos patrocinadores


Autor: Mauricio Junior
Publicado em: 5/29/2015 2:13:55 PM

SqlCommand e ExecuteNonQuery

 
Olá leitor(a) hoje eu vou mostrar e falar como trabalhar com SqlCommand e o método chamado ExecuteNonQuery responsável por executar comandos no banco de dados, ou melhor, enviar comandos para o banco de dados. Comandos como INSERT, UPDATE e DELETE.
 
Muitos desenvolvedores que começam a trabalhar com SqlCommand acabam escrevendo código de maneira errada, isso porque dependendo da maneira que você cria, qualquer pessoa que pensa que é hacker pode inserir valores apenas utilizando a combinação de aspas simples e duplas, a famosa invasão chamada injector sql.
 
O uso de parameter nesses casos é o essencial para evitar qualquer problema no site, sistema web ou até mesmo serviço móvel. Com experiência própria, já tentaram invadir o meu site usando essa técnica, isso porque eu registro todos os logs e tentativas em meu servidor a fim de saber o que está acontecendo e também para analisar os acessos. 
 
No começo no mundo da programação, um hacker acabou conseguindo inserir valores no meu banco de dados onde apontava o usuário para um local inseguro. Isso foi uma catástrofe para mim, porque o site que estava indexado no Google começou a ser classificado como site perigoso e todo browser bloqueava o site com um aviso de inseguro.
 
O site começou a cair a popularidade, entravam mais de mil pessoas por dia no site. De repente foi para zero. Esse aviso do Google dura pelo menos dois dias até que ele verifique novamente se o site está inseguro. Eu pensei no dia: como o hacker conseguiu fazer isso? Comecei a revisar todo o código e vi que o problema era o uso de aspas simples e duplas. O resto do site estava todo seguro.
 
Passei todo o uso para paramaters e nunca mais teve o problema. Em alguns casos, os hackers conseguem colocar um arquivo de programação em seu site como php, javascript ou até html. Isso prejudica ainda mais seu sistema, fica até mais difícil de rastrear. 
 
 
 
Vamos codificar
 
O primeiro passo que você entender é, você só vai usar Parameters se for necessário passar alguns valor dinâmico para o banco de dados que está selecionando, inserindo, deletando ou atualizando. Para o nosso caso hoje, você utilizar o ExecuteNonQuery para insert, update e delete. Nestes três casos são necessários o envio de parâmetros dinâmicos ou fixos, depende do seu banco de dados.
 
Definir a conexão com o banco de dados
 
Hoje o Visual Studio possibilita que o desenvolvedor coloque a string de conexão no arquivo de configuração, por exemplo: App.config ou Web.config. Se o banco mudar, usuário ou senha, basta alterar o arquivo de configuração sem ter que compilar o sistema novamente. Essa conexão precisa ser passada para a conexão com o banco de dados. Veja o código 1.
 
Código 1 - Conexão com o banco de dados
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SuaConn"].ToString()))
{
}
 
A parte do System.Configuration serve para pegar os dados da sua conexão no arquivo de configuração. O que você não pode esquecer na String de conexão é o nome do servidor ou ip, nome do banco de dados e dependendo da sua conexão, usuário e senha. Veja o exemplo de uma string de conexão no código 2.
 
Código 2 - String de conexão exemplo
<connectionStrings>
    <add name="SuaConn" connectionString="Data Source=SERVER\MSSQLSERVER_2012; User=user; Password=password; Initial Catalog=Nome_do_Banco”/>
  </connectionStrings>
  
Note que o nome da String de conexão é o mesmo indicado no código 1.
 
Depois disso, é necessário criar o comando responsável para envio ao banco de dados. Neste comandos você vai precisar adicionar alguns parâmetros. É bom utilizar sempre @ arroba para indicar os nomes. Veja no código 3.
 
Código 3 - Insert no banco de dados
string sqlQuery = "INSERT INTO Tabela (Campo1, Campo2, Campo3) VALUES (@campo1, @campo2, @campo3)“;
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SuaConn"].ToString())))
{
    using (SqlCommand dataCommand = new SqlCommand(sqlQuery, connection))
    {
    }
}
 
Note que na primeira linha existe o comando que precisa ser enviado ao banco de dados. Os valores estão utilizando @ para indicar que esse valor será tratado futuramente. 
 
Para os comandos, você pode fazer de duas maneiras: uma mais explicada e outra mais simples. Eu sinceramente gosto de utilizar a mais explicada mas eu vou mostrar aqui as duas maneiras. Dentro do segundo using você precisa definir os parâmetros e valores. Veja no código 4.
 
Código 4 - Definindo parâmetros e valores
IDataParameter campo1 = new SqlParameter();
campo1.ParameterName = "@campo1";
campo1.Value = valor_dinamico;
campo1.DbType = System.Data.DbType.String;
dataCommand.Parameters.Add(campo1);
 
Esse código deve ser feito para cada valor indicado com @ explicado no código 3. Note que o nome no SQL deve ser o mesmo na propriedade ParameterName. O valor desse campos deve estar na propriedade Value e tipo de dado enviado deve ser indicado na propriedade DbType. No final é necessário adicionar o valor ao command usando a linha dataCommand.Parameters.Add(campo1).
 
A outra maneira de adicionar parameter é a seguinte:
dataCommand.Parameters.AddWithValue(“@campo1", valor).
 
O banco deve assumir o tipo de dado enviado pois aqui não é necessário passar o tipo de dado. Veja o código 5.
 
Código 5 - Código quase completo
string sqlQuery = "INSERT INTO Tabela (Campo1, Campo2, Campo3) VALUES (@campo1, @campo2, @campo3)“;
 
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SuaConn"].ToString())))
{
    using (SqlCommand dataCommand = new SqlCommand(sqlQuery, connection))
    {
       IDataParameter campo1 = new SqlParameter();
       campo1.ParameterName = "@campo1";
       campo1.Value = valor_dinamico;
       campo1.DbType = System.Data.DbType.String;
       dataCommand.Parameters.Add(campo1);
 
       IDataParameter campo2 = new SqlParameter();
       campo2.ParameterName = "@campo1";
       campo2.Value = valor_dinamico2;
       campo2.DbType = System.Data.DbType.String;
       dataCommand.Parameters.Add(campo2);
 
       IDataParameter campo3 = new SqlParameter();
       campo3.ParameterName = "@campo1";
       campo3.Value = valor_dinamico3;
       campo3.DbType = System.Data.DbType.DateTime
       dataCommand.Parameters.Add(campo3);
    }
}
 
Depois de toda definição é necessário abrir o banco de dados com o comando Open(), chamar o método para executar o código e fechar o banco. Eu indico sempre fechar o banco dentro do finally. Veja o código 6.
 
 
Código 6 - Abrindo, executando e fechando o banco de dados
 
string sqlQuery = "INSERT INTO Tabela (Campo1, Campo2, Campo3) VALUES (@campo1, @campo2, @campo3)“;
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SuaConn"].ToString())))
{
try{
    using (SqlCommand dataCommand = new SqlCommand(sqlQuery, connection))
    {

       IDataParameter campo1 = new SqlParameter();
       campo1.ParameterName = "@campo1";
       campo1.Value = valor_dinamico;
       campo1.DbType = System.Data.DbType.String;
       dataCommand.Parameters.Add(campo1);
 
       IDataParameter campo2 = new SqlParameter();
       campo2.ParameterName = "@campo1";
       campo2.Value = valor_dinamico2;
       campo2.DbType = System.Data.DbType.String;
       dataCommand.Parameters.Add(campo2);
 
       IDataParameter campo3 = new SqlParameter();
       campo3.ParameterName = "@campo1";
       campo3.Value = valor_dinamico3;
       campo3.DbType = System.Data.DbType.DateTime
       dataCommand.Parameters.Add(campo3);
 
       connection.Open();
       dataCommand.ExecuteNonQuery();
 
    }
catch(SqlException ex)
{
       throw ex;
}
finally
{
       connection.Close();
}
}
 
Note que a conexão foi aberta dentro do try e fechada dentro do finally. Isso porque caso aconteça algum erro, é a conexão sempre será fechada. Alguns desenvolvedores esquecem de abrir a conexão para executar o comando, sem abrir não tem executar algum comando de insert por exemplo.
 
Bom, espero ter ajudado. Esse artigo é bem simples mas muitos não sabem fazer isso corretamente, por isso resolver escrever algo sobre. Qualquer dúvida, favor entre em contato comigo pelo site pessoal www.mauriciojunior.org
 

Revista ecode10 Magazine