none
Utilizar conexão com SQL em outros metodos RRS feed

  • Pergunta

  • Bom dia, Galera.

    Possuo uma aplicação, ao abri-la é solicitado informações de login, as mesmas são validadas no SQL e caso esteja correto conexão com o banco é aberta.

    Gostaria de saber se é possivel utilizar essa mesma conexão para outros metodos, exemplo para uma consulta, um insert( para cada um possuo um metodo diferente).

    Caso sim poderia me auxiliar.

    Segue metodo de conexão:

    public void ValidaLogin(Logins oLogins)

    {

     

     

    string ConnectionStrings = ConfigurationManager.ConnectionStrings["Wandercar"].ToString();

     

    ConnectionStrings = ConfigurationManager.AppSettings[""];

    ConnectionStrings =

    ConfigurationManager.AppSettings[""];

    ConnectionStrings = ConnectionStrings +

    "User ID=" + oLogins.Usuario + ";Password=" + oLogins.Senha + ";";

     

     

    SqlConnection conn = new SqlConnection(ConnectionStrings);

     

    SqlCommand cmd = new SqlCommand("", conn);

    cmd.CommandText =

    "Select count(*) from Logins where Usurio = @Usuario and Senha = @Senha";

    cmd.Parameters.AddWithValue(

    "@Usuario", oLogins.Usuario);

    cmd.Parameters.AddWithValue(

    "@Senha", oLogins.Senha);

    cmd.Connection.Open();

     

     

    int i = (int)cmd.ExecuteScalar();

     

    if (i == 0)

    {

     

    MessageBox.Show("Usurio ou senha incorretos", "Acesso Negado");

    }

     

    else

    {

     

    Default dft = new Default();

    dft.Show();

    }

    }

     



    Grato

    terça-feira, 23 de fevereiro de 2010 13:41

Respostas

  • Então, vc pode usar o pattern SingleTon, que significa utilizar apenas um objeto em toda a aplicação.

    Singleton
    http://javafree.uol.com.br/topic-852515-Implementando-o-singleton.html

    Tenho um exemplo que eu fiz uma vez.

     Public Class RepositorioProfissionalWeb
            Implements IRepositorioWebService(Of ProfissionalWebService.ProfissionalWebService)
    
            Private Shared _WebService As ProfissionalWebService.ProfissionalWebService
            Private Shared _Endereco As String
    
            Public Function RetornarWebService(ByVal enderecoIP As String) As ProfissionalWebService.ProfissionalWebService Implements IRepositorioWebService(Of ProfissionalWebService.ProfissionalWebService).RetornarWebService
                If _WebService Is Nothing Then
                    _WebService = New ProfissionalWebService.ProfissionalWebService(enderecoIP)
                End If
                If _Endereco Is Nothing Then
                    _Endereco = enderecoIP
                    If _WebService IsNot Nothing Then
                        _WebService.Dispose()
                    End If
                    _WebService = New ProfissionalWebService.ProfissionalWebService(enderecoIP)
                ElseIf _Endereco <> enderecoIP Then
                    If _WebService IsNot Nothing Then
                        _WebService.Dispose()
                    End If
                    _WebService = New ProfissionalWebService.ProfissionalWebService(enderecoIP)
                    _Endereco = enderecoIP
                End If
                Return _WebService
            End Function
        End Class
    O meu metodo retorna um webservice, o seu irá retornar uma Connection, e o seu parametro será a string de conexão em vez do ip.
    Em vez do shared do vb vc utiliza static, isto garante que vc terá apenas um objeto de conexão, mas lembre-se de abrir e fechar toda vez.

    No seu caso vc pode tbem em vez de passar a string por parametro, criar uma propriedade statica na classe e setar ela na primeira vez quando o usuario informar o usuario e senha dele, depois de setado uma vez essas informações ficaram ate vc fechar a aplicação. Depois nos formularios vc só chama a função, que retorna a conexão.


    Se sua pergunta foi respondida por favor marque a resposta como certa.
    terça-feira, 23 de fevereiro de 2010 20:42

Todas as Respostas

  • Bom dia Anderson
    Cara, tu pode sim usar esta conexão para outros métodos, o q aliás é o q se faz normalmente. O q tu deve fazer é declarar teu objeto connection fora do método ValidaLogin, como uma variável global. Só não esqueça de fechar tua conexão ao encerrar a aplicação (conn.close ).
    Falou
    terça-feira, 23 de fevereiro de 2010 13:46
  • Gabriel,

    nunca fiz isso poderia me passar um exemplo, tambem mostrar como usaria em outro metodo?

    agradeço a atenção

    terça-feira, 23 de fevereiro de 2010 14:16
  • Tua função validaLogin está numa classe, certo? Então nesta classe, no começo dela, antes dos métodos, tu declara teu objeto connection, assim:
    Private SqlConnection conn = new SqlConnection (ConnectionStrings);

    A partir daí, tu pode usar o objeto
    conn em qqr método desta classe.
    terça-feira, 23 de fevereiro de 2010 14:27
  • Gabriel, desculpa minha falta, mas ainda tenho duvida.

    por exemplo, segue abaixo minha classe de conexão, a qual vou utilizar ate o encerramento da aplicação: e abaixo segue uma classe de insert por exemplo, poderia mostrar como ficaria:

     

    public void ValidaLogin(Logins oLogins)

    {

     

     

    string ConnectionStrings = ConfigurationManager.ConnectionStrings["Wandercar"].ToString();

     

    //strings= WebConfigurationManager.ConnectionStrings[0];

    ConnectionStrings =

    ConfigurationManager.AppSettings[""];

    ConnectionStrings =

    ConfigurationManager.AppSettings[""];

    ConnectionStrings = ConnectionStrings +

    "User ID=" + oLogins.Usuario + ";Password=" + oLogins.Senha + ";";

     

     

    SqlConnection conn = new SqlConnection(ConnectionStrings);

     

    SqlCommand cmd = new SqlCommand("", conn);

    cmd.CommandText =

    "Select count(*) from Logins where Usurio = @Usuario and Senha = @Senha";

    cmd.Parameters.AddWithValue(

    "@Usuario", oLogins.Usuario);

    cmd.Parameters.AddWithValue(

    "@Senha", oLogins.Senha);

    cmd.Connection.Open();

     

     

    int i = (int)cmd.ExecuteScalar();

     

    if (i == 0)

    {

     

    MessageBox.Show("Usurio ou senha incorretos", "Acesso Negado");

    }

     

    else

    {

     

    Default dft = new Default();

    dft.Show();

    }

    cmd.Connection.Close();

     

    }


    Classe de insert:
    No casso pego a referencia de uma outra classe chamada cliente.
    abaixo falta a conexão, poderia mostrar como usaria a classe de conexão?

     

     

    public void InserirCliente(Clientes oCliente)

    {

     

    SqlCommand command = Persistencia.GetCommand("", CommandType.Text);

    command.CommandText =

    "INSERT INTO dbo.Clientes (Nome, Email, Telefone, Contato1, Contato2, Endereco, EnderecoNumero, EnderecoCep, EnderecoCidade, EnderecoEstado) values (@Nome, @Email, @Telefone, @Contato1, @Contato2, @Endereco, @EnderecoNumero, @EnderecoCep, @EnderecoCidade, @EnderecoEstado)";

    command.Parameters.Add(

    new SqlParameter("@Nome", oCliente.Nome));

    command.Parameters.Add(

    new SqlParameter("@Email", oCliente.Email));

    command.Parameters.Add(

    new SqlParameter("@Telefone", oCliente.Telefone));

    command.Parameters.Add(

    new SqlParameter("@Contato1", oCliente.Contato1));

    command.Parameters.Add(

    new SqlParameter("@Contato2", oCliente.Contato2));

    command.Parameters.Add(

    new SqlParameter("@Endereco", oCliente.Endereco));

    command.Parameters.Add(

    new SqlParameter("@EnderecoNumero", oCliente.EnderecoNumero));

    command.Parameters.Add(

    new SqlParameter("@EnderecoCep", oCliente.EnderecoCep));

    command.Parameters.Add(

    new SqlParameter("@EnderecoCidade", oCliente.EnderecoCidade));

    command.Parameters.Add(

    new SqlParameter("@EnderecoEstado", oCliente.EnderecoEstado));

     

     

    Persistencia.ExecuteNonQuery(command);

     



    abraço

    terça-feira, 23 de fevereiro de 2010 15:04
  • Blz,
    É só tu declarar teu objeto fora do método validaLogin. Antes do método validaLogin, fora de qqr método, tu declara o objeto, assim:
     Private SqlConnection conn = new SqlConnection (ConnectionStrings);
    Isto é uma variável global desta classe.
    Assim tu vai poder utilizar o objeto conn tbm no método InserirCliente.
    Caso ainda tenhas dúvidas, posta o código inteiro da classe, não só os métodos, daí t mostro como fica a classe.
    Falou
    terça-feira, 23 de fevereiro de 2010 16:00
  • ah idéia eu entendi, so mais uma duvida,

    voce fala para declarar:
    Private SqlConnection conn = new SqlConnection (ConnectionStrings);
    porém a minha connectionstring esta no metodo validaLogin, como ele vai reconheçer o metodo, sendo a declaração no inicio, ao digitar não encontra  (ConnectionStrings)??

    abraço
    terça-feira, 23 de fevereiro de 2010 17:08
  • Desculpe Anderson
    Não havia me atentado a este detalhe. Neste caso declara a conection string como global tbm.
    terça-feira, 23 de fevereiro de 2010 17:25
  • ok sem problemas, ja tem me ajudado bastante.
    porém tenho outra duvida....nao fica nervoso Gabriel, no caso minha connection string pega informações de uma outra classe chamada Logins, a qual traz do banco os campos, na minha
    classe valida Login eu declaro os metodos dela, conforme a linha abaixo:

     

    public void ValidaLogin(Logins oLogins)

      

    string ConnectionStrings = ConfigurationManager.ConnectionStrings["Wandercar"].ToString();

     

    ConnectionStrings =

    ConfigurationManager.AppSettings[""];

    ConnectionStrings =

     

    ConfigurationManager.AppSettings[""];

    ConnectionStrings = ConnectionStrings +

     

    "User ID=" + oLogins.Usuario + ";Password=" + oLogins.Senha + ";";

     Como eu faço para declarar os objetos oLogins.Usuario e oLogins.Senha na connection global?

     

    terça-feira, 23 de fevereiro de 2010 17:39
  • Sem problema. Eu não tinha ligado nisto.
    Então instacia teu objeto connetion sem a connection, assim:
    Private SqlConnection conn = new SqlConnection ();
    E no método validaLogin, tu seta a propriedade connectionString:
    conn.connectionString = ConfigurationManager .ConnectionStrings[ "Wandercar" ].ToString();



    terça-feira, 23 de fevereiro de 2010 18:01
  • Gabriel, agora acho que vai...rss
    a ultima duvida, para os outros metodos como insert e tal...como passo que a conexão a ser usada sera sempre a mesma, ou seja que ja foi validada com login e senha.

    O meu problema hoje é, eu consigo que o usuário conecte na aplicação com usuario e senha dele do banco, ou seja na primeira conexão esta sendo pelo usuário e senha dele. Porém ao executar algum metodo estou usando a conexão padrão ou seja do usuário do windows, porque ainda nao consegui instanciar a conexão validaLogin para os outros metodos.

    Não sei se vc tem um exemplo acho que me ajudaria, porque o que eu preciso apenas que o usuário se conecte na aplicação com seu usuário e para efetuar alguma ação continue usando a mesma conexão de logon e não abra e feche cada ação.

    Segue o metodo valida Login que cria a 1º conexão:

     

    public void ValidaLogin(Logins oLogins)

    {

     

     

     

    string ConnectionStrings = ConfigurationManager.ConnectionStrings["Wandercar"].ToString();

     

    //strings= WebConfigurationManager.ConnectionStrings[0];

    ConnectionStrings =

    ConfigurationManager.AppSettings[""];

    ConnectionStrings =

    ConfigurationManager.AppSettings[""];

    ConnectionStrings = ConnectionStrings +

    "User ID=" + oLogins.Usuario + ";Password=" + oLogins.Senha + ";";

     

     

    SqlConnection conn = new SqlConnection(ConnectionStrings);

     

    SqlCommand cmd = new SqlCommand("", conn);

    cmd.CommandText =

    "Select count(*) from Logins where Usurio = @Usuario and Senha = @Senha";

    cmd.Parameters.AddWithValue(

    "@Usuario", oLogins.Usuario);

    cmd.Parameters.AddWithValue(

    "@Senha", oLogins.Senha);

    cmd.Connection.Open();

     

     

    int i = (int)cmd.ExecuteScalar();

     

    if (i == 0)

    {

     

    MessageBox.Show("Usurio ou senha incorretos", "Acesso Negado");

    }

     

    else

    {

     

    Default dft = new Default();

    dft.Show();

    }

    cmd.Connection.Close();

     

    }

     

    segue um metodo qqer que tenho, exemplo de insert:

    {

     

    string ConnectionStrings = ConfigurationManager.ConnectionStrings["Wandercar"].ToString();

     

     

    SqlConnection conn = new SqlConnection(ConnectionStrings);

     

    SqlCommand cmd = new SqlCommand("", conn);

    command.CommandText =

    "INSERT INTO dbo.Clientes (Nome, Email, Telefone, Contato1, Contato2, Endereco, EnderecoNumero, EnderecoCep, EnderecoCidade, EnderecoEstado) values (@Nome, @Email, @Telefone, @Contato1, @Contato2, @Endereco, @EnderecoNumero, @EnderecoCep, @EnderecoCidade, @EnderecoEstado)";

    command.Parameters.Add(

    new SqlParameter("@Nome", oCliente.Nome));

    command.Parameters.Add(

    new SqlParameter("@Email", oCliente.Email));

    command.Parameters.Add(

    new SqlParameter("@Telefone", oCliente.Telefone));

    command.Parameters.Add(

    new SqlParameter("@Contato1", oCliente.Contato1));

    command.Parameters.Add(

    new SqlParameter("@Contato2", oCliente.Contato2));

    command.Parameters.Add(

    new SqlParameter("@Endereco", oCliente.Endereco));

    command.Parameters.Add(

    new SqlParameter("@EnderecoNumero", oCliente.EnderecoNumero));

    command.Parameters.Add(

    new SqlParameter("@EnderecoCep", oCliente.EnderecoCep));

    command.Parameters.Add(

    new SqlParameter("@EnderecoCidade", oCliente.EnderecoCidade));

    command.Parameters.Add(

    new SqlParameter("@EnderecoEstado", oCliente.EnderecoEstado));

     


    o que eu quero é que ao inves de abrir uma conexão com cada metodo, assim como faço no metodo acima, sempre usar a conexão ja aberta do valida login.


    Acho que se mandar um exemplo fica mais facil e paro de encomodar...rssrs

    abraços

    terça-feira, 23 de fevereiro de 2010 18:42
  • O legal seria sempre ao menos executar o Open e o Close dentro do método. O que vc poderia aproveitar seria apenas o objeto Connection que seria passado por parametro entre as classes.
    Se vc deixar a conexão aberta estará consumindo recursos do servidor, já imaginou varios clientes por varias horas com a conexão aberta. O ideal é a cada método fechar a conexão.

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    terça-feira, 23 de fevereiro de 2010 18:56
  • Se tu declarar o objeto connection como global, tu pode usar ele em qqr método da tua classe. No teu insert, usa o conn, aquele mesmo q tu seta a conectionstring no valida login. Só não esquece de declarar ele global (fora de qqr método, como sendo um atributo da classe).
    terça-feira, 23 de fevereiro de 2010 19:13
  • eu fiz isso, so que ele nao conecta pq nao pega nenhuma connection string, ou seja ele nao esta recebendo nehuma conexão.
    o conn em si nao possui nenhuma connection string, apenas o metodo validaLogon recebe a referencia para o conn os demais nao.
    terça-feira, 23 de fevereiro de 2010 19:27
  • Danimar, boa dica.

    Mas o meu problema é, eu não sei como passar o objeto connection entre as classes, poderia me passar um exemplo?

    Atualmente a primeira conexão é feita atraves dos dados do usuário informados em textbox, eu queria usar sempre essa mesma conexão, para outros metodos. Porque atualmente os outros metodos estao sendo feitos por um usuário e senha fixos, adicionados na connections string.
    mas queria que sempre usa-se o o proprio usuario e senha do usurio logado.


    grato
    terça-feira, 23 de fevereiro de 2010 19:45
  • Então, vc pode usar o pattern SingleTon, que significa utilizar apenas um objeto em toda a aplicação.

    Singleton
    http://javafree.uol.com.br/topic-852515-Implementando-o-singleton.html

    Tenho um exemplo que eu fiz uma vez.

     Public Class RepositorioProfissionalWeb
            Implements IRepositorioWebService(Of ProfissionalWebService.ProfissionalWebService)
    
            Private Shared _WebService As ProfissionalWebService.ProfissionalWebService
            Private Shared _Endereco As String
    
            Public Function RetornarWebService(ByVal enderecoIP As String) As ProfissionalWebService.ProfissionalWebService Implements IRepositorioWebService(Of ProfissionalWebService.ProfissionalWebService).RetornarWebService
                If _WebService Is Nothing Then
                    _WebService = New ProfissionalWebService.ProfissionalWebService(enderecoIP)
                End If
                If _Endereco Is Nothing Then
                    _Endereco = enderecoIP
                    If _WebService IsNot Nothing Then
                        _WebService.Dispose()
                    End If
                    _WebService = New ProfissionalWebService.ProfissionalWebService(enderecoIP)
                ElseIf _Endereco <> enderecoIP Then
                    If _WebService IsNot Nothing Then
                        _WebService.Dispose()
                    End If
                    _WebService = New ProfissionalWebService.ProfissionalWebService(enderecoIP)
                    _Endereco = enderecoIP
                End If
                Return _WebService
            End Function
        End Class
    O meu metodo retorna um webservice, o seu irá retornar uma Connection, e o seu parametro será a string de conexão em vez do ip.
    Em vez do shared do vb vc utiliza static, isto garante que vc terá apenas um objeto de conexão, mas lembre-se de abrir e fechar toda vez.

    No seu caso vc pode tbem em vez de passar a string por parametro, criar uma propriedade statica na classe e setar ela na primeira vez quando o usuario informar o usuario e senha dele, depois de setado uma vez essas informações ficaram ate vc fechar a aplicação. Depois nos formularios vc só chama a função, que retorna a conexão.


    Se sua pergunta foi respondida por favor marque a resposta como certa.
    terça-feira, 23 de fevereiro de 2010 20:42