none
Classe para conexao com o Banco de Dados RRS feed

  • Pergunta

  • Pessoal,
    Estou tentando implementar uma classe para conexao ao banco de dados, veja:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using FirebirdSql.Data.FirebirdClient;
    
    namespace ConsoleApplication1
    {
        class DbConnection
        {
            public FbConnection Connection { get; private set; }
    
            public DbConnection(string ConnectionString)
            {
                Connection = new FbConnection(ConnectionString);
            }
    
        }
    }
    

     

    E agora uma classe Cliente para fazer uso da mesma:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using FirebirdSql.Data.FirebirdClient;
    
    
    namespace ConsoleApplication1
    {
        class Cliente
        {
            private void Cadastrar()
            {
                using (DbConnection db = new DbConnection("")) 
                {
                    FbCommand ff = new FbCommand("", db.Connection);
                }
            }
        }
    }
    

    Ainda estou começando com o .NET e queria entender onde eu estou errando pois a mensagem de erro que tenho é esta:

    Error 1 'ConsoleApplication1.DbConnection': type used in a using statement must be implicitly convertible to 'System.IDisposable' 

     

    Obrigado pela atenção.

     

     

    quinta-feira, 8 de dezembro de 2011 17:56

Respostas

  • Malange, como é que é? "Remove o Using....Nao e boa forma de programar", WTF!!!!

    O using deve ser usado sempre que se precisar fazer dispose dos recursos utilizados pelo .net. E o principal uso do using é justamente em um objeto de gerenciamento de conexão com o banco de dados.

    O problema que vc teve é que sua classe DbConnection não implementa IDisposable, por isso que deu o erro em primeira mão.

    http://geekswithblogs.net/robp/archive/2008/02/03/looking-at-.net-the-disposable-pattern.aspx

    ------------------------------

    Entretanto, sugiro você procurar uma implementação open-source, dado que você não tem experiência em fazer isso e a chance de não atender a todos os requisitos é muito grande.

    Abs.


    HJ
    • Sugerido como Resposta hamiltonj quinta-feira, 8 de dezembro de 2011 23:31
    • Marcado como Resposta Marcelo Moreira Souza sexta-feira, 9 de dezembro de 2011 10:28
    quinta-feira, 8 de dezembro de 2011 23:31

Todas as Respostas

  • Boa tarde, amigo.

    Experimente usar este comando:

    private static void CreateCommand(string queryString,
        string connectionString)
    {
        using (SqlConnection connection = new SqlConnection(
                   connectionString))
        {
            SqlCommand command = new SqlCommand(queryString, connection);
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
    }


    Referencia:

    http://msdn.microsoft.com/pt-br/library/system.data.sqlclient.sqlconnection.aspx


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.
    quinta-feira, 8 de dezembro de 2011 18:17
  • Junior,

    No caso eu estava precisando fazer como deixei o codigo mesmo. Talvez nao tenha sido claro na minha duvida, o fato é que eu preciso instanciar minha classe de conexao dentro do bloco using.

     

    Obrigado pela atenção.

    quinta-feira, 8 de dezembro de 2011 18:22
  • Sem problemas, o código que lhe enviei funciona perfeitamente, basta voce adaptar o codigo acima a sua necessidade.

    private static void CreateCommand(string queryString,
        string connectionString)
    {
        using (SqlConnection connection = new SqlConnection(
                   connectionString))
        {
            SqlCommand command = new SqlCommand(queryString, connection);
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
    }
    Onde esta em negrito, faz exatamente o que voce quer.

    "instanciar minha classe de conexao dentro do bloco using."


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.
    quinta-feira, 8 de dezembro de 2011 18:27
  • Junior,

    Entao eu ja fiz isso, veja:

    using (DbConnection db = new DbConnection(""))

    Só que esta ocorrendo o erro:

    Error 1 'ConsoleApplication1.DbConnection': type used in a using statement must be implicitly convertible to 'System.IDisposable'

    quinta-feira, 8 de dezembro de 2011 18:30
  • Nao fiz o teste, mas olhando para seu codido:

    1 - DbConnection recebe como parametro ou string de conexao ou nao recebe nada no construtor dela:

    Entao ficaria asssim:

    using (DbConnection db = new DbConnection())


    Mas antes disso voce precisar passar qual a string de conexao para sua DbConnection.

    2 - Na linha:

    FbCommand ff = new FbCommand("aqui vai algum comando para o banco", db.Connection);

    Esta faltando o que voce quer enviar para o banco de dados.

    Faca esses testes. e post o resultado. Ok.


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.
    quinta-feira, 8 de dezembro de 2011 18:34
  • Junior,

    Neste caso ai eu realmente nao informei a string de conexao e nem passei os valores corretos para o fbcommand pois estou so no começo do codigo mesmo. O fato é que por algum motivo, talvez algo que esteja faltando na minha classe de conexao, nao é aceito que uma nova instancia de DbConnection seja realizada dentro de um bloco using, ja testei aqui e se eu nao usar o using, funciona.

    Obrigado

    quinta-feira, 8 de dezembro de 2011 18:37
  • Remove o Using....Nao e boa forma de programar, origina bastante erros, as vezes "falha" em ler certas linha. Como tu es inicante entao programa normalmente.

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Windows.Forms;

    using System.Text;

    using System.Data;

    using System.Data.OleDb;

    using System.Data.SqlClient;

     

    namespace WindowsFormsApplication2010

    {

        public class ConectionString

        {

            public SqlConnection conecatr = new SqlConnection();

            private string conecao = WindowsFormsApplication2010.Properties.Settings.Default.Connection;

     

            public string connectstring { get; set; }

     

            public ConectionString()

            {

                this.conecatr.ConnectionString = conecao;

            }

            private  SqlConnection abrir()

            {

                if (conecatr.State == System.Data.ConnectionState.Closed)

                {

                    conecatr.Open();

                }

                else

                {

                    conecatr.Close();

                }

                return conecatr;

            }

        }

    ----------------------------------------------------------//--------------------------------------------------------------------------------------

    Segundo Exmplo:

    namespace WindowsFormsApplication2010

    {

        public class NewDal: Tabela_Copy 

        {

            # region Conecao

            private SqlConnection sqlCn = new SqlConnection(@"Data Source=LEVI-PC\SQLEXPRESS;Initial Catalog=Teste_One;Integrated Security=True");

     

                public SqlConnection OpenConnection()

                {

                    if (sqlCn.State != ConnectionState.Open)

                    {

                        sqlCn.Open();

                    }

                    return sqlCn;              

                 }

    # endregion Conecao

    -------------------------------------------------------------------//------------------------------------------------------------------------------

    Terceiro Exemplo:

    namespace AutoRun

    {

        public class Class_Conecao

        {

            public OleDbConnection conectar;

            OleDbCommand Cnn_Command;

            OleDbDataAdapter adapter;

            OleDbParameter[] Criar_Par;

            public Class_Conecao()

            {

                conectar = new OleDbConnection();

                conectar.ConnectionString = 

    @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Levi\Documents\Database_Desenvolvimento.accdb";

                Cnn_Command = new OleDbCommand();

                adapter = new OleDbDataAdapter();

            }

     

            private OleDbConnection Open_Cnn()

            {

                if (conectar.State == System.Data.ConnectionState.Closed)

                {

                   conectar.Open();

                }

                return conectar;

            }

     

            private OleDbConnection Close_Cnn()

            {

                if (conectar.State == System.Data.ConnectionState.Open)

                {

                    conectar.Close();

                }

                return conectar;

            }

     


    One word frees us of all the weight and pain of life: that word is love.
    quinta-feira, 8 de dezembro de 2011 20:40
    Moderador
  • Malange, como é que é? "Remove o Using....Nao e boa forma de programar", WTF!!!!

    O using deve ser usado sempre que se precisar fazer dispose dos recursos utilizados pelo .net. E o principal uso do using é justamente em um objeto de gerenciamento de conexão com o banco de dados.

    O problema que vc teve é que sua classe DbConnection não implementa IDisposable, por isso que deu o erro em primeira mão.

    http://geekswithblogs.net/robp/archive/2008/02/03/looking-at-.net-the-disposable-pattern.aspx

    ------------------------------

    Entretanto, sugiro você procurar uma implementação open-source, dado que você não tem experiência em fazer isso e a chance de não atender a todos os requisitos é muito grande.

    Abs.


    HJ
    • Sugerido como Resposta hamiltonj quinta-feira, 8 de dezembro de 2011 23:31
    • Marcado como Resposta Marcelo Moreira Souza sexta-feira, 9 de dezembro de 2011 10:28
    quinta-feira, 8 de dezembro de 2011 23:31
  • Realmente as informações que encontro aqui no forum incentivam o uso do using, principalmente quando se trata de conexoes ao banco de dados.

    Hamilton, vou olhar agora o link que voce passou e da uma estudada.

    depois posto o resultado aqui.

    Obrigado pela atenção.

    sexta-feira, 9 de dezembro de 2011 10:16