none
Registro sendo incluído 2 vezes - OleDb RRS feed

  • Pergunta

  • Salve!

    Cenário: aplicação Web-MVC, Visual Studio 2013 Express, banco: Access

    Além do projeto do site (MVC), a aplicação tem um projeto do domínio da aplicação onde estão as classes das entidades, contextos e de negócios, conforme esquema abaixo:

    Enquete.Dominio

    • Aplicacao
    • Contextos
    • Entidades

    Em Contextos, tenho uma classe com o código abaixo:

    using System;
    using System.Configuration;
    using System.Data;
    using System.Data.OleDb;
    
    namespace EnqueteWeb.Dominio.Model.Contextos
    {
        public class BancoAplicacao : IDisposable
        {
            private readonly OleDbConnection conexao;
    
            public BancoAplicacao()
            {
                conexao = new OleDbConnection(ConfigurationManager.ConnectionStrings["BancoAplicacao"].ConnectionString);
                conexao.Open();
            }
    
             public void ExecutaAtualizacao(string strQuery)
            {
                var cmd = new OleDbCommand
                {
                    CommandText = strQuery,
                    CommandType = CommandType.Text,
                    Connection = conexao
                };
                cmd.ExecuteNonQuery();
            }
    
            public void Dispose()
            {
                if (conexao.State == ConnectionState.Open)
                    conexao.Close();
            }
        }
    }
    


    Em Aplicacao, tenho uma classe que tem o código abaixo (por clareza, estou mostrando somente o método que está apresentando o problema):

    using EnqueteWeb.Dominio.Model.Contextos;
    using EnqueteWeb.Dominio.Model.Entidades;
    using System;
    using System.Collections.Generic;
    using System.Data.OleDb;
    using System.Linq;
    
    namespace EnqueteWeb.Dominio.Model.Aplicacao
    {
        public class Enquetes
        {
            private BancoAplicacao banco;
    
            public void RegistrarVoto(Votante votante, Voto voto)
            {
                // Registra o voto
                var strQueryVoto = "INSERT INTO Votos (enqueteID, respostaID ) ";
                strQueryVoto += string.Format("VALUES ( {0}, {1} )", voto.EnqueteId, voto.RespostaId);
    
                // Registra o votante
                var strQueryVotante = "INSERT INTO Votantes (enqueteID, dtVoto, nome ) ";
                strQueryVotante += string.Format("VALUES ( {0}, #{1}#, '{2}' ) ", votante.EnqueteId, votante.DtVoto, votante.Nome);
                using (banco = new BancoAplicacao())
                {
                    banco.ExecutaAtualizacao(strQueryVoto);
                    banco.ExecutaAtualizacao(strQueryVotante);
                }
            }
        }
    }
    

    Bem, ao executar os códigos acima, o que está acontecendo é que são incluídos 2 registros em cada uma das tabelas!

    Tentei uma alteração no código do método RegistrarVoto, na classe Enquetes.cs, para:

    using EnqueteWeb.Dominio.Model.Contextos;
    using EnqueteWeb.Dominio.Model.Entidades;
    using System;
    using System.Collections.Generic;
    using System.Data.OleDb;
    using System.Linq;
    
    namespace EnqueteWeb.Dominio.Model.Aplicacao
    {
        public class Enquetes
        {
            private BancoAplicacao banco;
    
            public void RegistrarVoto(Votante votante, Voto voto)
            {
                // Registra o voto
                var strQueryVoto = "INSERT INTO Votos (enqueteID, respostaID ) ";
                strQueryVoto += string.Format("VALUES ( {0}, {1} )", voto.EnqueteId, voto.RespostaId);
                using (banco = new BancoAplicacao())
                {
                    banco.ExecutaAtualizacao(strQueryVoto);
                }
    
                // Registra o votante
                var strQueryVotante = "INSERT INTO Votantes (enqueteID, dtVoto, nome ) ";
                strQueryVotante += string.Format("VALUES ( {0}, #{1}#, '{2}' ) ", votante.EnqueteId, votante.DtVoto, votante.Nome);
                using (banco = new BancoAplicacao())
                {
                    banco.ExecutaAtualizacao(strQueryVotante);
                }
            }
        }
    }
    

    Continuou acontecendo a mesma coisa: 2 registros incluídos em cada uma das tabelas.

    Tentei uma modificação na classe BancoAplicacao, retirando a inicialização da conexão ao instanciar a classe, para:

    using System;
    using System.Configuration;
    using System.Data;
    using System.Data.OleDb;
    
    namespace EnqueteWeb.Dominio.Model.Contextos
    {
        public class BancoAplicacao : IDisposable
        {
            private OleDbConnection conexao;
    
            public void ExecutaAtualizacao(string strQuery)
            {
                conexao = new OleDbConnection(ConfigurationManager.ConnectionStrings["BancoAplicacao"].ConnectionString);
                conexao.Open();
                var cmd = new OleDbCommand
                {
                    CommandText = strQuery,
                    CommandType = CommandType.Text,
                    Connection = conexao
                };
                cmd.ExecuteNonQuery();
            }
    
            public void Dispose()
            {
                if (conexao.State == ConnectionState.Open)
                    conexao.Close();
            }
        }
    }
    

    O problema continua.

    Por favor, alguém pode me mostrar onde estou errando?

    Grato pela atenção de todos.

    Paulo Ricardo Ferreira

    quarta-feira, 27 de janeiro de 2016 13:34

Todas as Respostas

  • Olá <g class="gr_ gr_4 gr-alert gr_gramm undefined Punctuation multiReplace" data-gr-id="4" id="4">Ricardo !</g>

    Você já tentou usar ese Dispose para fechar a conexão após cada Atualização?

    sexta-feira, 29 de janeiro de 2016 13:04
  • Talvez seja algo nas camadas!

    Alguma coisa sendo chamada mais que uma vez!

    Como está a parte do MVC? Pode postar?


    Fulvio C

    sexta-feira, 29 de janeiro de 2016 17:54