Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Error: not all code paths return a value


EMSO.EXE

Pergunta

Pessoal estou com um problema em uma aplicação, sou iniciante em .Net :blink: , deveria fazer a conexão com o banco de dados (Access 2007) e abrir para executar os comandos sql, porém sempre retorna esse erro: Error 1 'Exercicio.Program.ConexaoBD()': not all code paths return a value :wacko:

Segue o código:

...
using System.Data;
using System.Data.OleDb;

///<sumary>
///Método que cria o menu na interface do usuário
///</sumary>

namespace Exercicio
{
    public class Program
    {

        static void Main(string[] args)
        {
            //Atribuição do título da janela
            Console.Title = "*** Cadastro de usuários e listagem de produtos ***";
            Program.CriaMenu();
        }

        ...

       /// <summary>
        /// Método para acessar o banco de dados e abrir
        /// </summary>
        public static OleDbConnection ConexaoBD()     <--------------- AQUI OCORRE O ERRO !!!!!!!!!!
        {
            OleDbConnection Conexao;

            Conexao = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;
                                                    Data Source=D:\Exercicio\BDados.accdb;
                                                    User Id=Admin;
                                                    Password=123456;");

            try
            {
                Conexao.Open();
                return Conexao;
            }
            catch (Exception Ex)
            {
                Console.Write("Erro: " + Ex.Message);
            }

        }

        /// <summary>
        /// Método para fechar banco de dados
        /// </summary>
        static void FechaConexaoBD(OleDbConnection Conexao)
        {
            if (Conexao.State == ConnectionState.Open)
            {
                Conexao.Close();
            }
        }

        /// <summary>
        /// Método para cadastrar usuário no banco de dados
        /// </summary>
        static void CadastrarUsuario()
        {
            int id;
            string nome, cpf, telefone, endereco;

            OleDbConnection AbrirConexao = new OleDbConnection();
            OleDbConnection FecharConexao = new OleDbConnection();

            AbrirConexao = ConexaoBD();

            ...

            FecharConexao = ConexaoBD();
        }

Agradeço a ajuda!

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Olha, toda vez que você cria um método que possui algum valor de retorno ele necessáriamente DEVE retornar algum valor.

Você colocou um controle try catch dentro do método. Se por algum motivo Conexao.Open() gerar algum erro, seu método ficará sem retorno, pois o bloco catch não retorna nada e logo após o método termina. Como o compilador não sabe se o bloco try vai ou não causar uma exceção, ele gera essa mensagem de erro.

Coloque um return null; no bloco catch ou no final do método que irá corrigir esse problema.

Só um detalhe. Se por acaso acontecer algum erro e ConexaoDB retornar null, você poderá receber um erro de execução (null reference) no seu programa, se algum método tentar trabalhar com o valor retornado pela ConexaoDB.

Testa ai e avisa se deu :)

Abraços

PS: Olha, eu vi ali que você está iniciando, então deixa eu te passar um dica quente. A maior vantagem de se trabalhar com .NET é o fato de ser uma linguagem gerenciada. Ou seja, você pode sair criando objetos (new isso, new aquilo) sem se preocupar com o q vai acontecer depois, porque o coletor de lixo irá resolver o problema para você. Mas se você não estruturar bem seu código, você poderá acabar com um código pouco eficiente e em casos muito ruins, ter que gastar dinheiro com um pc melhor para suportar seu programa/site.

Por exemplo:

Dentro de CadastrarUsuario você instancia um novo objeto OleDbConnection:

OleDbConnection AbrirConexao = new OleDbConnection();

Depois, dentro de ConexaoDB, você cria um outro objeto OleDbConnection, o retorna e aponta AbrirConexao para esse novo objeto

OleDbConnection Conexao;

Conexao = new OleDbConnection(@...);

AbrirConexao = ConexaoDB();

Resultado? Você acaba com um objeto inútil, pois o primeiro new OleDbConnection foi substituido pelo criado dentro de ConexaoDB(). Em um quadro de testes, isso não faz diferença alguma. Mas se você um dia for desenvolver aplicações de servidores, essa prática pode tornar seu programa extremamente ineficiente.

Você poderia simplesmente fazer

OleDbConnection AbrirConexao;

AbrirConexao = ConexaoDB();

ou

OleDbConnection AbrirConexao = ConexaoDB();

Flws

Editado por Lucas Phillip
Link para o comentário
Compartilhar em outros sites

  • 0

static OleDbConnection ConexaoBD()
        {
            OleDbConnection Conexao;

            Conexao = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;
                                                    Data Source=D:\Exercicio\BDados.accdb;
                                                    User Id=Admin;
                                                    Password=123456;");

            try
            {
                Conexao.Open();
                return Conexao;
            }
            catch (Exception Mensagem)
            {
                Console.Write("Erro: " + Mensagem.Message);
                return null;
            }
        }
...segui as orientações e funcionou! Esta fazendo a conexão e abrindo o banco, porém estou agora com erro na hora de fechar o banco: Error 1 No overload for method 'FecharConexaoBD' takes '0' arguments, pelo o que pesquisei e entendi é que deve retornar um valor para o método FecharConexaoBD, mas não estou sabendo como implementar isso... :huh:
static void FecharConexaoBD(OleDbConnection Conexao)
        {
            if (Conexao.State == ConnectionState.Open)
            {
                Conexao.Close();
            }
        }

        static void CadastrarUsuario()
        {
            int id;
            string nome, cpf, telefone, endereco;

            OleDbConnection Conexao;
            Conexao = ConexaoBD();

            ...

            Conexao = FecharConexaoBD();      <------- AQUI OCORRE O ERRO!
        }

Agradeço a ajuda!

Link para o comentário
Compartilhar em outros sites

  • 0

Overload ou sobrecarga é quando existem vários métodos com o mesmo nome mas parâmetros diferentes.

Ex:

private void Write(string strval)
{
}

private void Write(int intval)
{
}

etc

Da uma olhada no método FecharConexaoBD. Ele não possui overload (só existe um dele) e esse método requer um argumento, que no caso é um objeto OleDbConnection. Como você está chamando FecharConexaoDB sem passar nenhum argumento, você esta vendo esse erro de compilador.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...