 C#
-  ADO 
.NET para Iniciantes - III - Command (SqlCommand)
C#
-  ADO 
.NET para Iniciantes - III - Command (SqlCommand)
|  | Este é um mini-curso sobre ADO .NET para iniciantes usando a linguagem C#. | 
Esta chegando 
agora ??? 
Então acompanhe os dois primeiros artigos:
Os requisitos mínimos para que você aproveite este minicurso é possuir um pouco de conhecimento sobre lógica de programação.
Se você não conhece a linguagem C# pode ler os seguintes artigos :
Se você já conhece VB .NET e esta querendo a aprender C# sugiro que você leia o meu artigo:
O material necessário para acompanhar o curso é: (Irei utilizar o Visual C# 2008 Express Edition)
1- 
Visual C# 2008 Express 
Edition
2- SharpDevelop 2.2
3- SQL Server 2005 Express Edition 
Todos esses programas são gratuitos e portanto você não vai gastar um centavo neste curso.
Durante o curso vamos desenvolver uma aplicação com acesso a dados usando C# de forma que você irá fazendo e aprendendo na prática os principais conceitos básicos envolvidos.
Mas chega de papo e vamos ao que interessa...
Falando um pouco sobre o objeto SqlCommand
O objetivo desta aula é descrever o objeto SqlCommand e como você pode usá-lo para interagir com um banco de dados. Resumindo os objetivos são:
Veja na tabela a seguir um resumo para cada um dos métodos citados:
| Método | Descrição | 
| ExecuteReader | Executa a consulta e retorna um objeto SqlDataReader; | 
| ExecuteNonQuery | Executa a 
    consulta e não retorna nenhuma coleção. Usado para instruções INSERT, DELETE e 
    UPDATE onde retorna o número de registros afetados. Ex: SqlCommand sqlComm = new SqlCommand("DELETE FROM Categories WHERE CategoryID=1", sqlConn); sqlComm.ExecuteNonQuery(); | 
| ExcecuteScalar | Executa a consulta e retorna um único valor.(uma linha e uma coluna) | 
Introdução
Um objeto SqlCommand permite que você especifique qual tipo de interação você deseja realizar em um banco de dados: selecionar, incluir, modificar e excluir dados e pode ser usado para dar suporte em operações em um cenário de gerenciamento de dados no modelo desconectado mas irei focar nesta aula como usar o SqlCommand de forma simples e isolada.
| A 
    classe SqlCommand é usada para representar uma instrução SQL ou 
    stored procedure disparada com o objetivo de inserir, atualizar, excluir 
    ou selecionar informações de uma fonte de dados. A sua posição na hierarquia 
    de classes da plataforma .NET é dada a seguir: System.Object System.MarshalByRefObject System.ComponentModel.Component System.Data.Common.DbCommand System.Data.Odbc.OdbcCommand System.Data.OleDb.OleDbCommand System.Data.OracleClient.OracleCommand System.Data.SqlClient.SqlCommand System.Data.SqlServerCe.SqlCeCommand | 
Para criar um objeto SqlCommand podemos usar um construtor criando uma instância da classe SqlCommand passando a string SQL que representa qual operação desejamos realizar contra o banco de dados e o objeto SqlConnection que deverá ter sido criado anteriormente contendo a conexão com a fonte de dados:
SqlCommand cmd = new SqlCommand("select * from Clientes", conn);
Podemos então realizar as seguintes operações com o objeto SqlCommand:
| Nos exemplos 
    abaixo irei usar uma tabela chamada Clientes com a seguinte 
    estrutura: 
 | 
1- Consultar dados
Para consultar dados você usa uma instrução SQL SELECT para retornar um conjunto de dados para visualização.
Para obter este resultado você pode usar o método ExecuteReader o qual retorna um objeto SqlDataReader da seguinte forma:
// 1. 
Instancia um novo comando com uma consulta e uma conexão
SqlCommand cmd = new SqlCommand("select * from 
Clientes", conn);
// 2. Chama o método ExecuteReader para obter o 
resultado da consulta
SqlDataReader dr = cmd.ExecuteReader();
2- Incluir dados
Para inserir registros em um banco de dados use o método ExecuteNonQuery do objeto SqlCommand :
// prepara 
um comando SQL para incluir dados usando a instrução INSERT INTO
string  
incluiSQL = @" insert into Clientes (Nome, Email) values ('Macoratti', 'macoratti@ig.com.br')";
// 1. 
Instancia 
um novo comando com uma consulta e uma conexão
SqlCommand cmd = new SqlCommand(incluiSQL 
, conn);
// 2. Chama o método
ExecuteNonQuery para enviar o comando
cmd.ExecuteNonQuery(); 
Aqui alteramos ligeiramente a forma de instanciar um objeto SqlCommand passando a variável incluiSQL como parâmetro.
Um detalhe importante é que estamos incluindo valores 
para os campos Nome e Email mas a tabela 
possui um campo id que é a chave primária que não faz parte da instrução. Isto é 
devido ao fato da inclusão deste campo ser feita de forma automática pelo SQL 
Server. Se você tentar incluir um valor para o campo id no código irá obter uma 
exceção em tempo de execução.
3- Atualizar dados
O método ExecuteNonQuery também é usado para 
atualização de dados:
// prepara um comando SQL para incluir dados usando a instrução Update
string 
atualizaSQL = @"update Clientes set Nome = 'Macoratti'  where id = 1";
// 1.Instancia 
um novo comando com uma consulta sql
SqlCommand cmd = new SqlCommand(atualizaSQL 
);
// 2.  Define a propriedade Connection
cmd.Connection = conn;
// 3. Chama o método 
ExecuteNonQuery para enviar o comando
cmd.ExecuteNonQuery(); 
Neste código usamos um construtor 
SqlCommand que possui somente um comando, logo em seguida nós atribuímos o 
objeto SqlConnection (conn) usando a propriedade
Connection do objeto SqlCommand cmd;
 
Com isso mostramos que podemos alterar o objeto Connection a qualquer tempo.
4- Excluir dados
O método ExecuteNonQuery também é usado para 
excluir dados:
// prepara um comando SQL para incluir dados usando a instrução DELETE
string 
excluiSQL = @"delete from Clientes where id = 1";
// 1. Instantcia um novo comando
SqlCommand cmd = new 
SqlCommand();
// 2. Define a propriedade CommandText
cmd.CommandText = 
excluiSQL 
;
// 3. 
Define a propriedade Connection
cmd.Connection = conn;
// 4. 
 Chama o método 
ExecuteNonQuery para enviar o comando
cmd.ExecuteNonQuery(); 
Neste exemplo usamos o construtor SqlCommand sem 
parâmetros mas logo em seguida definimos explicitamente as propriedades 
CommandText e Connection do objeto SqlCommand, cmd.
Com isso mostramos que podemos alterar o objeto Connection  
e Command a qualquer tempo.
 
5- Obtendo valores
Às vezes tudo o que você precisa do banco de dados é um valor único que pode ser 
o resultado de uma contagem, soma, média, ou  outro valor agregado. Usar um
ExecuteReader e calcular o resultado no seu código não é a forma mais 
eficiente de fazer isso. A melhora maneira é deixar o banco de dados realizar a 
operação e retornar apenas um valor único como resultado. Para isso usamos o 
método ExecuteScalar:
// 1. Instantcia um novo comando
SqlCommand cmd 
= new SqlCommand("select count(*) from 
Clientes", conn);
// 2. Chama o método  ExecuteScalar para enviar o comando
int count = (int)cmd.ExecuteScalar();
A consulta no construtor SqlCommand obtém a contagem de todos os registros a partir da tabela Clientes e irá retornar somente o valor da contagem.
O método ExecuteScalar retorna um valor do tipo Object, temos que efetuar uma coerção forçada (casting) para converter o valor para um int.
| using System.Data.SqlClient; namespace adonetCshp_3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            string connetionString = null;
            SqlConnection cnn = default(SqlConnection);
            SqlCommand cmd = default(SqlCommand);
            string sql = null;            connetionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=Cadastro;Integrated Security=SSPI";
   
            sql = "Select Count(*) from clientes";            cnn = new SqlConnection(connetionString);
            try
            {
                cnn.Open();
                cmd = new SqlCommand(sql, cnn);
                Int32 contador = Convert.ToInt32(cmd.ExecuteScalar());
                cmd.Dispose();
                cnn.Close();
                MessageBox.Show(" No. de linhas " + contador );
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível abrir a conexão com o banco de dados ! " + ex.Message.ToString());
            } 
        }
    }
} | 
A seguir um exemplo realizando as operações CRUD 
na tabela Clientes do banco de dados Cadastro.mdf:
 
| using System; using System.Data; using System.Data.SqlClient; class ExecutaInsertUpdateDelete
{
   public static void exibirRegistro(SqlCommand comando, string ID)
   {
     comando.CommandText ="SELECT codigo, nome FROM Clientes WHERE codigo = '" + ID + "'";SqlDataReader dr = comando.ExecuteReader();      while (dr.Read())
     {
       listBox1.Items.Add("dr[\" codigo\"] = " +  dr["codigo"]);
       listBox1.Items.Add("dr[\" nome\"] =  "  + dr["Nome"]);
     }dr.Close(); }    public static void Main()
   {    connetionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=Cadastro;Integrated Security=SSPI";
    SqlConnection conexaoSql =new SqlConnection(connetionString) ;    SqlCommand comando = conexaoSql.CreateCommand();
    comando.CommandText ="INSERT INTO Clientes (codigo, nome) VALUES (" + " 19, 'Macoratti')";conexaoSql.Open();     int numeroLinhasAfetadas = comando.ExecuteNonQuery();
    llistBox1.Items.Add("Numero de linhas afetadas = " + numeroLinhasAfetadas); exibirRegistro(comando, "9"); comando.CommandText = "UPDATE Clientes SET Nome = 'Novo' WHERE codigo = 19";     numeroLinhasAfetadas = comando.ExecuteNonQuery();
    listBox1.Items.Add("Numero de linhas atualizadas = " + numeroLinhasAfetadas);
    exibirRegistro(comando, "9");comando.CommandText ="DELETE FROM Clientes WHERE codigo = 19";     numeroLinhasAfetadas = comando.ExecuteNonQuery();
    listBox1.Items.Add("Numero de linhas deletadas = " + numeroLinhasAfetadas);conexaoSql.Close(); } } | 
Para encerrar eu gostaria de falar sobre o bloco using:
A instrução using declara o início de um bloco Using e opcionalmente adquire os recursos do sistema que o bloco controla.
Um bloco Using garante a liberação de um ou mais dos tais recursos quando seu código estiver finalizado com eles. Isso torna-os disponíveis para uso por outros códigos.
| As Classes
    SqlConnection e SqlCommand implementam a interface
    IDisposable e isto significa que eles 
    podem usar recursos não gerenciados e liberar tais recursos é trabalho do 
    desenvolvedor, de forma que depois de usar estas classes temos que chamar o 
    método Dispose(). Se ocorrer uma exeção no acesso ao banco de dados temos que ter certeza que o Dispose() foi chamado , este é um motivo para usar a palavra reservada Using. | 
Obs: Recursos gerenciados são descartados pela coletor de lixo .NET Framework (GC) sem qualquer codificação extra de sua parte. Você não precisa de um bloco Using para recursos gerenciados.
Veja abaixo um exemplo de bloco Using para criar uma tabela em um banco de dados; a string de conexão esta sendo obtida a partir do arquivo de configuração
|     using (SqlConnection con = new SqlConnection(Macoratti.Properties.Settings.Default.MacorattiConnectionString))
    {
        con.Open();
        try
        {
            using (SqlCommand command = new SqlCommand("CREATE TABLE Macoratti (Codigo INT, Nome TEXT, Endereco TEXT)", con))
            {
                command.ExecuteNonQuery();
            }
        }
        catch
        {
            Console.WriteLine("Tabela não pode ser criada");
        }
    } | 
Outro exemplo usando Using e comparando com a sintaxe tradicional sem usar Using:
| using (SqlConnection cn = new 
    SqlConnection(connectionString)) { using (SqlCommand cm = new SqlCommand(commandString, cn)) { cn.Open(); cm.ExecuteNonQuery(); } } 
 | SqlConnection cn =  null; SqlCommand cm = null; 
    try | 
Os dois trechos de código acima são equivalentes.
No próximo artigo irei falar sobre o objeto SqlDataReader.
Eu sei é apenas C# mas eu gosto...

| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 | 
             Gostou ?
  Compartilhe no Facebook
  
Compartilhe no Facebook 
  
 Compartilhe no Twitter
  
Compartilhe no Twitter
 
Referências: