none
Problemas em uma Session

    Question

  •  

    Boa Noite

     

    Seguinte, no SelectedIndexChanged de uma dropdownlist eu insiro o SelectedValue do dropdown em uma session e mando esse mesmo valor como o parametro para uma sub que faz uma alteração no web.config

     

    O problema é o seguinte. Se ocorre a alteração no web.config a Session perde o valor senão ocorre a session mantem o valor.

     

    Como eu faço pra manter o valor na session e alterar o web.config??

     

    Code Snippet

    Protected Sub CBO_LOJAS_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CBO_LOJAS.SelectedIndexChanged

    Session("ConnString") = CBO_LOJAS.SelectedValue

    CONFIG_CONNSTRING(CBO_LOJAS.SelectedValue)

    End Sub

     

     

     

    Code Snippet

    Sub CONFIG_CONNSTRING(ByVal CONNSTRING As String)

    Dim webConfig As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")

    Dim dbConnString As ConnectionStringsSection = webConfig.ConnectionStrings

    Try

    'Adding

    dbConnString.ConnectionStrings.Add(New ConnectionStringSettings("csSummer", "server=127.0.0.1;user id=xxx;Password=xxx;persist security info=True;database=" & CONNSTRING, "MySql.Data.MySqlClient"))

    Catch ex As Exception

    'Changing

    dbConnString.ConnectionStrings("csSummer").ConnectionString = "server=127.0.0.1;user id=xxx;Password=xxx;persist security info=True;database=" & CONNSTRING

    Finally

    webConfig.Save()

    End Try

    End Sub

     

     

    Tuesday, November 18, 2008 1:06 AM

Answers

  • Olá Junior,

     

    No Web.config você pode definir quantas connection strings você quiser... É só dar um nome diferente para cada uma. Assim, acredito que o primeiro passo, seja definir as duas strings de conexão no Web.config, manualmente. Algo como:

     

    Code Snippet

     

     <connectionStrings>

    <add name="Matriz" connectionString="Data Source=DbMatriz; ..." />

    <add name="Filial" connectionString="Data Source=DbFilial; ..." />

     </connectionStrings>

     

    Em seguida, você cria a sua tela onde o usuário pode selecionar se quer utilizar a Matriz ou Filial.. Por exemplo, com uma DropDownList:

     

    Code Snippet

     

     <asp:DropDownList ID="ddlBancoDeDados" runat="server">

    <asp:ListItem Value="Matriz">Acessar Matriz</asp:ListItem>

    <asp:ListItem Value="Filial">Acessar Filial</asp:ListItem>

     </asp:DropDownList></div>

     

     

    Por fim, quando o usuário selecionar o banco de dados que pretende utilizar, você apenas "informa" a sua classe de banco de dados, qual será a connection string que você quer utilizar. Algo como:

     

    Code Snippet

     

     'Obtém a Connection String de acordo com a seleção no DropDownList

     Dim connectionString As String

     connectionString = WebConfigurationManager.ConnectionStrings(ddlBancoDeDados.SelectedValue).ConnectionString

     

    Na pior das hipóteses (se a classe de banco de dados não permitir essa aproximação), você poderia gravar a escolha do usuário em uma variável de sessão, e recuperá-la lá na classe de banco de dados.

     

    ---

     

    Dessa forma, você nunca precisará alterar o Web.config através via código, e consequentemente, sua aplicação não será reiniciada...

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    Tuesday, November 18, 2008 3:59 PM

All replies

  • Olá Junior,

     

    Essa é uma característica do ASP .NET... Qualquer modificação que você fizer no Web.config (inclusive se alguém for lá manualmente), faz com que a aplicação seja reinicializada para incorporar as novas configurações do Web.config.

     

    Isso significa que é esperado que você perca as variáveis de sessão.

     

    Nesse seu caso específico, eu não sei porque você utiliza Session para guardar a ConnectionString, uma vez que você pode obtê-la a qualquer momento, através da propriedade ConnectionStrings da classe WebConfigurationManager:

     

    Code Snippet

     

     WebConfigurationManager.ConnectionStrings("csSummer")

     

     

    De qualquer forma, se você faz mesmo questão de utilizar variáveis de Sessão, basta você recriar a variável de sessão lá no seu método CONFIG_CONNSTRING, logo após você gravar as configurações (webConfig.Save).

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    Tuesday, November 18, 2008 11:50 AM
  •  

    Vlw pela resposta.

    Então vamos colocar na seguinte situação. Um usuario entra no sistema e começa a gravar em variáveis de sessão.

    Outro usuario entra no sistema e modifica o web.config. Então as variaveis de sessão do primeiro usuario serão perdidas??

     

     

    Tuesday, November 18, 2008 12:18 PM
  • Olá Júnior,

     

    Na verdade, todas as variáveis de sessão de todos os usuários são perdidas Wink. Lembre-se que você está fazendo um "reboot" na sua aplicação ASP .NET.

     

    Não sei exatamente o tipo de aplicação que você está desenvolvendo, mas alterar informações no Web.config não é bem o tipo de coisa que fazemos todos os dias Big Smile.

     

    Para ter uma idéia, tenho aplicações que estão rodando há mais de um ano sem parar, sem qualquer alteração no Web.config.

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    Tuesday, November 18, 2008 12:30 PM
  •  

    Eu preciso acessar 2 bancos de dados. Eles tem a mesma estrutura, mas~tem dados completamente diferentes. Achei q essa fosse a melhor forma. mas agora descobri que não é

     

    Alguma indicação de como fazer??

    Tuesday, November 18, 2008 12:33 PM
  • Olá Junior,

     

    Acho que não entendi exatamente qual a sua dúvida, porque você pode acessar quantos bancos de dados diferentes você quiser... A connection string não precisa estar no Web.config para você conseguir.

     

    Onde você está tendo dificuldade em conectar em mais de um banco de dados?

     

    Abraços,
    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    Tuesday, November 18, 2008 3:21 PM
  •  

    é o seguinte, eu to ageitando o sistema q um cara fez. E foi feito da seguinte forma.

    Ele tem uma classe q faz todo o trabalho de acesso ao BD. Nessa classe é q estava a Connectionstring.

    O sistema roda em 2 lojas, cada uma tem seu bd. Mas o dono quer transportar o BD da filial para a Matriz todos os dias no final da tarde (Coisa dele lá, pela internet é mais facil, mas ele n que.)

     

    Pensei então em criar outra connectionstring, apontando para esse segundo bd e fazer na tela de login ele escolher qual bd vai acessar escolhendo o nome da loja.

    Ou seja quando ele escolher na dropdownlist a matriz, o sistema vai utilizar a connectionstring do BD matriz, quando ele escolher Filial ele vai usar a connectionstring da filial.

     

    Foi assim q pensei, se tiver geito melhor, aceito sugestões

     

    Ah. O dono pode acessar o BD da filial, mas os outros usuarios que estiverem usando a connectionstring da Matriz deveram permanecer nela. Sem perder variaveis de sesão ou ter o sistema reiniciado

    Tuesday, November 18, 2008 3:38 PM
  • Olá Junior,

     

    No Web.config você pode definir quantas connection strings você quiser... É só dar um nome diferente para cada uma. Assim, acredito que o primeiro passo, seja definir as duas strings de conexão no Web.config, manualmente. Algo como:

     

    Code Snippet

     

     <connectionStrings>

    <add name="Matriz" connectionString="Data Source=DbMatriz; ..." />

    <add name="Filial" connectionString="Data Source=DbFilial; ..." />

     </connectionStrings>

     

    Em seguida, você cria a sua tela onde o usuário pode selecionar se quer utilizar a Matriz ou Filial.. Por exemplo, com uma DropDownList:

     

    Code Snippet

     

     <asp:DropDownList ID="ddlBancoDeDados" runat="server">

    <asp:ListItem Value="Matriz">Acessar Matriz</asp:ListItem>

    <asp:ListItem Value="Filial">Acessar Filial</asp:ListItem>

     </asp:DropDownList></div>

     

     

    Por fim, quando o usuário selecionar o banco de dados que pretende utilizar, você apenas "informa" a sua classe de banco de dados, qual será a connection string que você quer utilizar. Algo como:

     

    Code Snippet

     

     'Obtém a Connection String de acordo com a seleção no DropDownList

     Dim connectionString As String

     connectionString = WebConfigurationManager.ConnectionStrings(ddlBancoDeDados.SelectedValue).ConnectionString

     

    Na pior das hipóteses (se a classe de banco de dados não permitir essa aproximação), você poderia gravar a escolha do usuário em uma variável de sessão, e recuperá-la lá na classe de banco de dados.

     

    ---

     

    Dessa forma, você nunca precisará alterar o Web.config através via código, e consequentemente, sua aplicação não será reiniciada...

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    Tuesday, November 18, 2008 3:59 PM
  • Blz, so não entendi uma coisa. Sem utilizar a variavel de sessão. Após fazer o login, digamos na pagina de cadastro de

    clientes, tem como eu ainda pegar o valor selecionado na ddlBancoDeDados la na pagina de login??

     

     

    Tuesday, November 18, 2008 4:13 PM
  •  Jjunior75 wrote:

    Blz, so não entendi uma coisa. Sem utilizar a variavel de sessão. Após fazer o login, digamos na pagina de cadastro de

    clientes, tem como eu ainda pegar o valor selecionado na ddlBancoDeDados la na pagina de login??

     

    Não... Você terá de guardar em algum lugar: Session, ViewState, Cookies, etc...

     

    Abraços,

    Caio Proiete

    Tuesday, November 18, 2008 4:57 PM