none
(Alterar ConnectionString do Settings em RunTime) (Usar um projeto Windows dentro de outro projeto Windows) RRS feed

  • Discussão Geral

  •  

    Saudações,

     

    Projeto Windows Application C# 2005

     

    Estava com o seguinte problema. Em um projeto Windows desenvolvi as seguintes telas:

    Login

    Alterar Senha do Usuario

    Criar Usuario

    Criar Grupo de Permissões

     

    E isso eu utilizo em todos os meus projetos. Então eu queria desenvolver isso em um projeto a parte e poder utilizar em todos os meus outros projetos. Mas tinha um problema, que seria a String de conexão. No projeto default ele acessa um banco de teste que possui as tabelas e store procedures. A camada de acesso a dados foi feita usando DataSet e configurando os DataTables pelo Wizard. Logo ele cria a ConnectionString e eu teria que mudar em tempo de execução.

     

    Essa string de conexão fica armazenada no Settings sendo do tipo ConnectionString e é uma propriedade somente leitura, não permitindo a alteração de uma forma mais pratica.

     

    Tentei primeio usando o namespace System.Configuration usando o ConfigurationManager, mas para o meu problema em questão não resolvia ele sempre pegava a string de conexão que estava configurada e não a que eu passava.

     

    Pelo artigo do link http://www.codeproject.com/useritems/PersistConnectionStrings.asp?df=100&forumid=438111&select=2236994#xx2236994xx cheguei a uma solução e de forma bem simples.

     

    Segue o codigo:

     

    Adicione na classe Settings o método abaixo

     

    Code Block

    namespace OpportunitySysrtemLoginWin.Properties

    {

    // This class allows you to handle specific events on the settings class:

    // The SettingChanging event is raised before a setting's value is changed.

    // The PropertyChanged event is raised after a setting's value is changed.

    // The SettingsLoaded event is raised after the setting values are loaded.

    // The SettingsSaving event is raised before the setting values are saved.

      internal sealed partial class Settings

      {

        public void SetUserOverride(string property, string value)

        {

          this[property] = value;

        }

      }

    }

     

     

    Um exemplo de como chamar o metodo

     

    Code Block

    public static void SetConnectionString(string connectionString)

    {

       OpportunitySysrtemLoginWin.Properties.Settings.Default.SetUserOverride("LoginConnectionString", connectionString);

    }

     

     

    Expondo agora como foi feito o uso do outro projeto.

     

    O projeto de Login não foi desenvolvido em camadas, o DataSet esta no mesmo projeto Windows para facilitar o acesso das funções e também ficar de uma forma mais simples a utilização a partir de outro projeto.

     

    O projeto de login foi feito de forma "Normal" apenas foi adicionado uma classe de Configuração, onde a ideia é poder expor tudo aquilo que pode ser configurado, como cor das telas, caption das mensagens, caption dos forms e o mais importante a String de conexão.

     

    segue a classe de configuração bem resumida

     

    Code Block

    using System;

    using System.Collections.Generic;

    using System.Text;

    namespace OpportunitySysrtemLoginWin

    {

       public class Configuracoes

       {

          public class CFrmLogin

          {

             public static string Text = string.Empty;

          }

          public class DataBase

          {

             public static void SetConnectionString(string connectionString)

             {

                 OpportunitySysrtemLoginWin.Properties.Settings.Default.SetUserOverride  ("LoginConnectionString", connectionString);

             }

          }

       }

    }

     

     

    Com o projeto de Login pronto. Criei então o meu outro projeto de Teste que vai utilizar o projeto de Login.O projeto de Teste foi desenvolvido em 3 camadas.(Camada de Apresentação, Component, e Acesso a Dados).

     

    Na camada de acesso a dados expus a string de conexão da seguinte forma.

    Code Block

    using System;

    using System.Collections.Generic;

    using System.Text;

    namespace TaskerManagerDBC

    {

    public class UI

    {

    public string ConnectionString()

    {

    return Properties.Settings.Default.TaskManagerConnectionString;

    }

    }

    }

     

     

     

    Adicionei ao projeto a referencia do projeto de Login

     

    Na Classe Program do projeto de teste coloquei o seguinte codigo

    Code Block

    //Pega a string de conexão do projeto TESTE da camada de acesso a dados

    TaskerManagerDBC.UI dalUI = new TaskerManagerDBC.UI();

     

    //Configura o projeto de login

    OpportunitySysrtemLoginWin.Configuracoes.CFrmLogin.Text = "Tasker Manager"; // texto da tela de login

    OpportunitySysrtemLoginWin.Configuracoes.DataBase.SetConnectionString(dalUI.ConnectionString()); //aqui passo a string de conexão a ser utilizada pelo projeto de login

     

    //Declaro o form referente ao projeto de Login

    OpportunitySysrtemLoginWin.FrmLogin frm = new OpportunitySysrtemLoginWin.FrmLogin();

     

    // E chamo normalmente o form de login que foi implementado em outro projeto

    if (frm.ShowDialog() == DialogResult.OK) Application.Run(new MDI_MenuPrincipal());

    else frm.Dispose();

     

     

    Agora posso utilizar o mesmo projeto de login em qualquer aplicação. Para isso basta rodar o script das tabelas e stores procedures e adicionar o codigo acima.

     

     

    sexta-feira, 12 de outubro de 2007 08:06