Usuário com melhor resposta
Classe para conexao com o Banco de Dados

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.
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
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. -
-
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. -
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'
-
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. -
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
-
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. -
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
-
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.