none
Alterar connection string RRS feed

  • Pergunta

  • Estou desenvolvendo uma aplicação em VB .Net usando o VS 2008 e banco de dados sql server 2000.

    Gostaria de montar uma aplicação que pudesse alterar a connection string do meu arquivo .config, acessando diretamente e alterando seu valor.

    Como posso fazer isso ???
    quinta-feira, 2 de abril de 2009 13:32

Respostas

  • Olá, Junior.
    Há muito tempo estou caçando uma forma de "reconfigurar" o arquivo app.config e seus desdobramentos.
    Mas há, na minha opinião, um grande erro de engenharia dos datasets que o VS cria.
    Veja esta discussão: http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/f8a11f0c-f86f-47f3-8d74-0e90572bea07

    Nela há outro link para outra fase de perguntas que já fiz e tentei resolver. Mas a batalha tem sido inglória.
    Talvez consigamos nos ajudar, já que estamos com o mesmo problema.

    Resumindo, não vejo problema algum e fazer a aplicação ler e alterar o app.config original. O grande problema está na forma como os projetos, dentro de uma solução, usam este arquivo. Vou ser direto: ELES NÃO USAM! Pelo menos não usam se você está usando os datasets tipados.

    Estou muito frustrado.

    Se você souber de algo, por favor, coloque aqui e eu farei a mesma coisa, se conseguir uma solução.

    Até mais,

    Ricardo Ildefonso
    Londrina - Brasil.
    Bom dia, bom trabalho.
    sexta-feira, 17 de abril de 2009 14:12
  • Pessoal,

    Li suas dificuldades e achei este post que pode ser útil para resolver o problema:

    http://codebetter.com/petervanooijen/2006/08/11/change-a-database-connection-string-from-code/

    Não testei pois não domino o C#. Caso alguém consiga resolver o problema, fico grato também.

    Bom trabalho.

    terça-feira, 31 de janeiro de 2012 16:31
  • Quando eu preciso alterar a ConnectionString da aplicação eu faço isso diretamente no XML em que ela está gravada...

    Ex.:

    Private Sub GraxalXML()
            Try
                Dim XmlDoc As New XmlDocument
                Dim XmlNod As XmlNode
    
                XmlDoc.Load("NomeDaAplicacao.exe.config")
                XmlNod = XmlDoc.DocumentElement.Item("connectionStrings")
                XmlNod("add").Attributes("connectionString").InnerText = "Data Source=" & TbCaminhoServidor.Text & ";Initial Catalog=BDSQL;User ID=Cliente;Password=123"
                XmlDoc.Save("NomeDaAplicacao.exe.config")
            Catch ex As Exception
                Throw New Exception(ex.Message)
            End Try
        End Sub
    

    Att. Osni
    terça-feira, 31 de janeiro de 2012 17:17

Todas as Respostas

  • Ola Rafael, desculpe a demora, mas estava envolvido em outras etapas do meu sistema.

    Eu li todos os links, mas nao achei a solução do que eu queria.

    Veja bem eu quero poder alterar dinamicamente uma connection string que esta armazenada no arquivo app.config.
    eu quero ter uma tela no sistema que ao abrir, mostre pra mim a connection string e eu possa altera-la.
    Eu consigo ler o arquivo, pegar o valor da connection string, mas apos alterar e tentar gravar ele diz que o arquivo é somente leitura.

    pelo que eu ja vi do vb 2008, deve ter uma forma bem pratica pra isso, ja que eu posso ler com facilidade. Mas nao encontrei.

    Por favor se vc puder me ajudar, estou realmente precisando disso.

    Obrigado.
    quarta-feira, 15 de abril de 2009 18:30
  • Júnior.

    Os arquivos app.config fazem parte da aplicação. É como se fosse um arquivo de resource externo. Por mais que ele seja alterado na mão durante a execução do aplicativo, as alterações só farão efeito qdo vc fechar e iniciar novamente o aplicativo.

    Se vc realmente quer permitir que o aplicativo altere a string de conexão e deseja que a mudança seja on-time, te encorajo a utilizar uma outra forma, como por exemplo, um arquivo ini.

    Atenciosamente,

    Rafael Cabral

    quarta-feira, 15 de abril de 2009 18:42
  • Rafael,
    ´
    Bom, na realidade, eu estou desenvolvendo uma aplicação para um cliente que é uma agroindustria. Eu sou programador a 27 anos, trabalhei com COBOL, ACCESS, VB até a versao 6, mas o cliente quer que tudo rode numa plataforma moderna, usando os recursos do VB.net, eu até acho facil editar o arquivo app.config, mas ele quer isso aconteça de uma forma interna no sistema.

    ele quer que na tela de login eu possa ter acesso a um formulario que permita alterar a string fazendo assim uma alteração na connection string de forma dinamica. Estamos cientes que ao alterar a connection string, teremos que reiniciar o sistema para que ela passe a ter efeito.

    Se vc puder dar uma mao quanto a isso, ficaremos agradecidos, mas se a opção do arquivo ini for mais viavel, por favor me de uma mao para que eu possa implementar.

    Desde ja Obrigado pela atenção.
    quarta-feira, 15 de abril de 2009 18:48
  • Junior.

    Nesse caso acho melhor o arquivo ini. Sei que seria muito mais organizado e mais limpo utilizar um app.config, mas para o que vc precisa não serviria.

    No .NET em si, não tem nenhuma forma nativa de utilizar esse tipo de arquivo. Para isso, temos que utilizar as funções não-gerenciadas da API do Windows.

    Abaixo um exemplo de como utilizar arquivo ini.

    imports System.Runtime.InteropServices
    
    <DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileStringW", CharSet = CharSet.Unicode)> _
    Private Shared Function WritePrivateProfileString _
    (ByVal lpApplicationName As String, _
    ByVal lpKeyName As String, _
    ByVal lpString As String, _
    ByVal lpFileName As String) As Integer
    
    <DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileStringW", CharSet = CharSet.Unicode)> _
    Private Shared Function GetPrivateProfileString _
    (ByVal lpApplicationName As String, _
    ByVal lpKeyName As String, _
    ByVal lpDefault As String, _
    ByVal lpReturnedString As String, _
    ByVal nSize As Integer, _
    ByVal lpFileName As String) As Integer
    
    Public Function LerIni(ByVal Path As String, ByVal SectionName As String, ByVal KeyName As String, ByVal DefaultValue As String) As String
    
       Dim sData As String = Space$(1024)
       Dim n As Integer = GetPrivateProfileString(SectionName, KeyName, DefaultValue, sData, sData.Length, Path)
    
       If n > 0 Then
          Return sData.Substring(0, n)
       Else
          Return ""
       End If
    
    End Function
    
    Public Sub EscreverIni(ByVal Path As String, ByVal SectionName As String, ByVal KeyName As String, ByVal Value As String)
    
       WritePrivateProfileString(SectionName, KeyName, Value, Path)
    
    End Sub
    Espero ter ajudado.

    Atenciosamente,

    Rafael Cabral
    quarta-feira, 15 de abril de 2009 19:07
  • Júnior.

    Esqueci de complementar.

    Para usar, vc faz assim:

    Supondo arquivo config.ini

    ****************************************************
    [BANCO]
    stringConnection=Data Source=...
    ****************************************************

    Carregar config:

    Dim stringConn As String
    stringConn = LerIni("C:\Diretorio\config.ini", "BANCO", "stringConnection", "")
    Escrever config:

    EscreverIni("C:\Diretorio\config.ini", "BANCO", "stringConnection", stringConn)
    Atenciosamente,

    Rafael Cabral
    quarta-feira, 15 de abril de 2009 19:14
  • Rafael...

    Bom, sua sugestão ta anotada, vou tentar ainda usar a solução que eu gostaria, caso nao consiga, parto pra sua ideia.

    eu consigo acessar a connection string gravada no app.config da seguinte forma:

    strconnection = My.Settings.ERPBDGComConnectionString

    mas qdo eu tento alterar da retorno dizendo que my.settings é read only

    ai, me passaram a seguinte opção:

    strconnection = System.Configuration.ConfigurationSettings.AppSettings("connectionString")

    só que o vb, marca como obsoleta a expressão "ConfigurationSettings", sugerindo que eu troque por "ConfigurationManager"

    so que esta opção nao esta disponivel no intelisense...

    o que fazer???

    quarta-feira, 15 de abril de 2009 20:02
  • Dim c As System.Configuration.Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)

    'Altere a sessão NomeDaSessaoAlterada...

    c.Save()
    ConfigurationManager.RefreshSection("NomeDaSessaoAlterada")
    blog: http://lblima.blogspot.com
    quarta-feira, 15 de abril de 2009 20:09
    Moderador
  • Leonardo...

    Bom, primeiro obrigado pela atenção.

    eu testei o que vc me passou acima, mas da um erro dizendo que "openExeConfiguration nao é membro de configurationManager", o mesmo acontece com "c.save()" e "refreshSection".

    eu importei os seguintes namesystem:

    Imports System
    Imports System.Configuration
    Imports System.Collections.Generic
    Imports System.Collections
    Imports System.Text

    falta importar algo para que funcione????
    quinta-feira, 16 de abril de 2009 13:06
  • Estranho, não precisa fazer nada. Qual tipo de aplicação (template) você está fazendo?
    blog: http://lblima.blogspot.com
    quinta-feira, 16 de abril de 2009 13:10
    Moderador
  • Leonardo...

    estou desenvolvendo uma aplicação do zero, é uma aplicação windows forms em VB .net e uso o VS 2008 Professional.

    a aplicação funciona, so que o cliente quer que eu crie esta alteração de connectionstring de forma dinamica para poder implantar nas outras unidades com mais facilidade.

    eu referenciei a system.configuration.dll e passou a nao dar mais o erro, mas nao consigo alterar a seção que eu preciso.
    quinta-feira, 16 de abril de 2009 13:48
  • Olá, Junior.
    Há muito tempo estou caçando uma forma de "reconfigurar" o arquivo app.config e seus desdobramentos.
    Mas há, na minha opinião, um grande erro de engenharia dos datasets que o VS cria.
    Veja esta discussão: http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/f8a11f0c-f86f-47f3-8d74-0e90572bea07

    Nela há outro link para outra fase de perguntas que já fiz e tentei resolver. Mas a batalha tem sido inglória.
    Talvez consigamos nos ajudar, já que estamos com o mesmo problema.

    Resumindo, não vejo problema algum e fazer a aplicação ler e alterar o app.config original. O grande problema está na forma como os projetos, dentro de uma solução, usam este arquivo. Vou ser direto: ELES NÃO USAM! Pelo menos não usam se você está usando os datasets tipados.

    Estou muito frustrado.

    Se você souber de algo, por favor, coloque aqui e eu farei a mesma coisa, se conseguir uma solução.

    Até mais,

    Ricardo Ildefonso
    Londrina - Brasil.
    Bom dia, bom trabalho.
    sexta-feira, 17 de abril de 2009 14:12
  • Pessoal,

    Li suas dificuldades e achei este post que pode ser útil para resolver o problema:

    http://codebetter.com/petervanooijen/2006/08/11/change-a-database-connection-string-from-code/

    Não testei pois não domino o C#. Caso alguém consiga resolver o problema, fico grato também.

    Bom trabalho.

    terça-feira, 31 de janeiro de 2012 16:31
  • Quando eu preciso alterar a ConnectionString da aplicação eu faço isso diretamente no XML em que ela está gravada...

    Ex.:

    Private Sub GraxalXML()
            Try
                Dim XmlDoc As New XmlDocument
                Dim XmlNod As XmlNode
    
                XmlDoc.Load("NomeDaAplicacao.exe.config")
                XmlNod = XmlDoc.DocumentElement.Item("connectionStrings")
                XmlNod("add").Attributes("connectionString").InnerText = "Data Source=" & TbCaminhoServidor.Text & ";Initial Catalog=BDSQL;User ID=Cliente;Password=123"
                XmlDoc.Save("NomeDaAplicacao.exe.config")
            Catch ex As Exception
                Throw New Exception(ex.Message)
            End Try
        End Sub
    

    Att. Osni
    terça-feira, 31 de janeiro de 2012 17:17