Quem sabe um dia você 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 dadosCadastro.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. Logo após, 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>e 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:
- ListBox – lsbResultado
- TextBox – txtValor e txtVendedor
- Button – btnExibir, btnIncluirPagamento e btnSair
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