Entity Framework 5 - Executando comandos SQL contra a fonte de dados - I


Quem sabe um dia você talvez vá precisar executar um comando SQL contra uma fonte de dados em um projeto que usa o Entity Framework. Este artigo mostra como fazer isso.

Vamos montar o cenário para que possamos mostrar como é simples executar comandos SQL com o Entity Framework.

Suponha que você tenha uma tabela de Pagamentos em um banco de dados SQL Server. Abaixo vemos a estrutura da tabela Pagamentos que foi criada em um banco de dados Cadastro.mdf do SQL Server Express 2008.

Vamos criar um Entity Data Model usando o Entity Framework e o Visual Studio 2012 Express for desktop.

Abra o Visual Studio 2012 Express for desktop e clique em New Project;

Selecione a linguagem Visual Basic -> Windows e a seguir o template Windows Forms Application; informe o nome EF_ExecutandoComandosSQL e clique em OK;

A seguir clique no menu PROJECT -> Add New Item e selecione Data -> ADO .NET Entity Data Model informando o nome Pagamentos.edmx e clicando em Add;

Na próxima janela do assistente clique em Generate from Database e clique em Next>;

Selecione a conexão com o banco de dados de sua escolha, no exemplo estamos usando a conexão com o banco de dados Cadastro.mdf;

Selecione a tabela Pagamentos e marque as opções conforme a figura abaixo e clique no botão Finish;

Ao final teremos o nosso Entity Data Model gerado conforme abaixo:

Isso é tudo que precisamos para mostrar como executar comandos SQL contra uma fonte de dados usando o Entity Framework.

Defina no início do formulário as declarações dos namespaces usados no projeto:

Imports System.Data.Common
Imports System.Data.SqlClient

Defina no formulário form1.vb o seguinte leiaute usando os controles:

No evento Click do botão de comando - Incluir Pagamento - temos o código abaixo:

 Private Sub btnIncluirPagamento_Click(sender As Object, e As EventArgs) Handles btnIncluirPagamento.Click

        Dim valorPagamento As Double = Convert.ToDouble(txtValor.Text)

        Using context = New CadastroEntities()

            Dim sql As String = "insert into Pagamentos(valor, vendedor)" & vbCr & vbLf & "values (@valor, @vendedor)"

            Dim args = New DbParameter() {New SqlParameter() With {.ParameterName = "valor", .Value = valorPagamento},
                                          New SqlParameter() With {.ParameterName = "vendedor", .Value = txtVendedor.Text}}

            contador += context.Database.ExecuteSqlCommand(sql, args)
            lsbResultado.Items.Add("Comando SQL - Insert Into executado : " + contador.ToString())

        End Using

    End Sub

O codigo acima defina uma string contendo uma instrução SQL INSERT INTO para incluir dados na tabela Pagamentos e utiliza dois parâmetros : @valor e @vendedor

Para executar o comando SQL usamos o método DataBase.ExecuteSqlCommand que executa um comando arbitrário diretamente contra a fonte de dados usando a conexão existente

O método DataBase.ExecuteSqlCommand executa a instrução SQL - "insert into Pagamentos(valor, vendedor)" & vbCr & vbLf & "values (@valor, @vendedor) - e usa os valores dos parâmetros informados: valorPagamento e txtVendedor;

Usar comandos parametrizados ajuda na proteção contra ataques de injeção de SQL, no qual um invasor "injeta" um comando em uma instrução SQL que compromete a segurança no servidor. Comandos parametrizados protegem contra um ataque de injeção de SQL ao garantir que os valores recebidos de uma fonte externa são passados como valores somente e não fazem parte da instrução SQL.

Como resultado, os comandos SQL inseridos em um valor não serão executados na fonte de dados. Em vez disso, eles são avaliados somente como um valor de parâmetro. Além os benefícios de segurança, os comandos parametrizados fornecem um método conveniente para organizar os valores passados com uma instrução SQL ou a um procedimento armazenado.

O comando é executado no contexto da transação atual, se houver uma transação atual.

Para exibir os pagamentos incluídos na tabela temos o código no evento Click do botão Exibir Processamento:

Private Sub btnExibir_Click(sender As Object, e As EventArgs) Handles btnExibir.Click
        Using context = New CadastroEntities()
            Console.WriteLine("Pagamentos")
            Console.WriteLine("============")
            For Each pagamento In context.Pagamentos
                lsbResultado.Items.Add("Pagamento : " & pagamento.valor.ToString("C") & " - " & pagamento.vendedor)
            Next
        End Using
    End Sub

Executando o projeto e incluindo os valores temos o seguinte resultado:

Examinando a tabela Pagamentos no banco de dados iremos confirmar a execução da instrução SQL Insert Into:

Segue o projeto completo aqui: EF_ExecutandoComandosSQL.zip

Na próxima parte veremos como podemos retornar objetos do nosso modelo usando comandos SQL.

Rom 8:22 Porque sabemos que toda a criação, conjuntamente, geme e está com dores de parto até agora;

Rom 8:23 e não só ela, mas até nós, que temos as primícias do Espírito, também gememos em nós mesmos, aguardando a nossa adoração, a saber, a redenção do nosso corpo.

Rom 8:24 Porque na esperança fomos salvos. Ora, a esperança que se vê não é esperança; pois o que alguém vê, como o espera?

Rom 8:25 Mas, se esperamos o que não vemos, com paciência o aguardamos.

      Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti