• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

gastao

Buscar base de dados a um ficheiro .ini

33 mensagens neste tópico

Boas novamente,

o que eu quero fazer é do genero ter um ficheiro .ini em que vai ficar o nome da base de dados e o caminho da mesma, e o programa ao arrancar ia ler e abrir esse mesmo, alg csg dar uma dica sobre esta situaçao?

o conteudo do ini:

[baseDados]

NomeBaseDados=XPTO

CaminhoBaseDados=C:\Programas\XPTO

cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque não usam as builtin settings com âmbito à aplicação?

Cria um XML todo bonito com todas as settings que precisas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Abres um ficheiro como stream, e lês linha a linha até reconhecer os campos q precisas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou a escrever um exemplo em cima do joelho, Tive a almoçar entretanto mas já posto.

Quer um INI, damos um INI! Não quero que falte nada :cheesygrin:

1

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui está, um pouco em cima do joelho mas até ficou porreirita para enfiar para uma classe e fazer uma coisa bonita... B)

Para testares, abre um projecto novo, mete 2 botões no form e substituí todo (mesmo todo) o código por este:

Public Class Form1

    Private INI As New Dictionary(Of String, Dictionary(Of String, String))
    Private UltimaChave As String = String.Empty
    Private UltimasEntradas As New Dictionary(Of String, String)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        Dim ofd As New OpenFileDialog
        ofd.Filter = "Ficheiros INI|*.ini"
        ofd.ShowDialog()

        Dim SR As New IO.StreamReader(ofd.FileName)
        While Not SR.EndOfStream
            ParseINI(SR.ReadLine)
        End While
        ParseINI("")
        SR.Close()
    End Sub

    Private Sub ParseINI(ByVal Linha As String)
        Select Case Strings.Left(Linha, 1)

            Case "["
                UltimaChave = Strings.Mid(Linha, 2, Linha.Length - 2)
            Case ""

                Dim TempUE As New Dictionary(Of String, String)
                For Each KVP As KeyValuePair(Of String, String) In UltimasEntradas
                    TempUE.Add(KVP.Key, KVP.Value)
                Next
                INI.Add(LCase(UltimaChave), TempUE)
                UltimaChave = String.Empty
                UltimasEntradas.Clear()

            Case Else
                If UltimaChave <> Nothing Then
                    Dim P() As String = Split(Linha, "=")
                    UltimasEntradas.Add(LCase(P(0)), P(1))
                End If

        End Select
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            'as duas que precisas
            MsgBox(INI("basedados")("nomebasedados"))
            MsgBox(INI("basedados")("caminhobasedados"))

            'e outra para veres
            MsgBox(INI("outracoisaqualquer")("outraquetanto"))
        Catch
            MsgBox("Chave inexistente")
        End Try
    End Sub
End Class

Acabei agora mesmo de a escrever, mas testei um INI com este conteúdo:

[baseDados]
NomeBaseDados=glamorama
CaminhoBaseDados=C:\Programas\XPTO

[OutraCoisaQualquer]
UmaSettingMarada=xpto
OutraQueTanto=Oh meu deus!!
EmaisOutraParaAsRestantesNaoFicaremSozinhas=lol, lol

Tou cá, aliás, estamos cá todos para esclarecimentos, se necessário.

EDIT: Esqueci-me de dizer que o button1 serve para carregar o INI e o button2 para ir consultar uns valores

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui está, um pouco em cima do joelho mas até ficou porreirita para enfiar para uma classe e fazer uma coisa bonita... B)

Para testares, abre um projecto novo, mete 2 botões no form e substituí todo (mesmo todo) o código por este:

Public Class Form1

    Private INI As New Dictionary(Of String, Dictionary(Of String, String))
    Private UltimaChave As String = String.Empty
    Private UltimasEntradas As New Dictionary(Of String, String)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        Dim ofd As New OpenFileDialog
        ofd.Filter = "Ficheiros INI|*.ini"
        ofd.ShowDialog()

        Dim SR As New IO.StreamReader(ofd.FileName)
        While Not SR.EndOfStream
            ParseINI(SR.ReadLine)
        End While
        ParseINI("")
        SR.Close()
    End Sub

    Private Sub ParseINI(ByVal Linha As String)
        Select Case Strings.Left(Linha, 1)

            Case "["
                UltimaChave = Strings.Mid(Linha, 2, Linha.Length - 2)
            Case ""

                Dim TempUE As New Dictionary(Of String, String)
                For Each KVP As KeyValuePair(Of String, String) In UltimasEntradas
                    TempUE.Add(KVP.Key, KVP.Value)
                Next
                INI.Add(LCase(UltimaChave), TempUE)
                UltimaChave = String.Empty
                UltimasEntradas.Clear()

            Case Else
                If UltimaChave <> Nothing Then
                    Dim P() As String = Split(Linha, "=")
                    UltimasEntradas.Add(LCase(P(0)), P(1))
                End If

        End Select
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            'as duas que precisas
            MsgBox(INI("basedados")("nomebasedados"))
            MsgBox(INI("basedados")("caminhobasedados"))

            'e outra para veres
            MsgBox(INI("outracoisaqualquer")("outraquetanto"))
        Catch
            MsgBox("Chave inexistente")
        End Try
    End Sub
End Class

Acabei agora mesmo de a escrever, mas testei um INI com este conteúdo:

[baseDados]
NomeBaseDados=glamorama
CaminhoBaseDados=C:\Programas\XPTO

[OutraCoisaQualquer]
UmaSettingMarada=xpto
OutraQueTanto=Oh meu deus!!
EmaisOutraParaAsRestantesNaoFicaremSozinhas=lol, lol

Tou cá, aliás, estamos cá todos para esclarecimentos, se necessário.

quando abres o openfiledialog e depois metes cancelar dá erro xD

mas de resto está muito bom :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

LOL.

Está bem, acrescenta-lhe depois do ShowDialog:

If ofd.Filename=Nothing then Exit Sub

É um exemplo de como ele pode fazer, não está errorhandled. Só meti o TryCatch no fim porque ele podia exprimentar com o INI dele e a ultima chave não existe.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens este exemplo que é o que uso para ler os ficheiros INI.

Já não me lembro onde arranjei este código  B)

É simples de usar

    Private Declare Ansi Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" _
           (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 GetIniSetting(ByVal strKey As String, ByVal strSection As String, ByVal strIniFile As String) As String

        Dim strValue As String
        Dim intPos As Integer

        On Error GoTo ErrTrap

        strValue = Space(1024)

        GetPrivateProfileString(strSection, strKey, "INI File Error", strValue, 1024, strIniFile)

        Do While InStrRev(strValue, " ") = Len(strValue)
            strValue = Mid(strValue, 1, Len(strValue) - 1)
        Loop

        ' to remove a special chr in the last place
        strValue = Mid(strValue, 1, Len(strValue) - 1)
        GetIniSetting = strValue

ErrTrap:
        If Err.Number <> 0 Then Err.Raise(Err.Number, , "Error form Functions.GetIniSettings " & Err.Description)

    End Function

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Gosto do exemplo do ribeiro55 usando um Dictionary, mas para ler os velhinhos ficheiros INI's (já longe de serem usados) a forma mais simples é usando as API's GetPrivateProfileString e WritePrivateProfileString, como o PauloR sugeriu.

Existem vários exemplos disponíveis na NET, mas só usava mesmo se fosse "obrigado".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Gosto do exemplo do ribeiro55 usando um Dictionary, mas para ler os velhinhos ficheiros INI's (já longe de serem usados) a forma mais simples é usando as API's GetPrivateProfileString e WritePrivateProfileString, como o PauloR sugeriu.

Existem vários exemplos disponíveis na NET, mas só usava mesmo se fosse "obrigado".

Então aconselhas um XML para guardar configurações?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não é para isso que servem as applicattion settings????

Embora eu também use ini's..... :-(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então aconselhas um XML para guardar configurações?

Sim, sempre!

não é para isso que servem as applicattion settings?

Os settings são uma forma simples de criar um ficheiro XML B)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mto obrigado, objectivo e poder ter a aplicaçao a trab em varias maquinas ao msm tempo, sendo assim digo lhes o caminho da bd... penso que ira resultar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ele vai buscar o ini na boa, :P mas como e q eu ligo me a base de dados atraves desse ini?????

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o ini deve guardar os valores da conection string... é so para isso que serve.....

Eventualmente podes guardar o nome do ultimo utilizador, do login.....

mas e  essencialmente usado para guardar definições da conexão

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

como assim nao percebi???? como e q eu faço para ir buscar esses valores?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso tens nos posts anteriores, já puseram o código q precisas e tudo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu percebi o ini, porque vai me ler apenas os campos, mas imagina que eu quero agora ligar me a uma base de dados a partir do ini

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu percebi o ini, porque vai me ler apenas os campos, mas imagina que eu quero agora ligar me a uma base de dados a partir do ini

Atenção ao Português :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim tens razao, pk o que eu kero mesmo é a partir de um ini ligar me a base de dados, se me faço entender!!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim tens razao, pk o que eu kero mesmo é a partir de um ini ligar me a base de dados, se me faço entender!!!!

Vê se isto serve, usando o exemplo que dei na outra página para ler os INI's  :P

    Public Function fCnnString() As String

        Dim strIniFile As String = "NomedoINI.ini"

        Dim strDb As String = GetIniSetting("CaminhoBaseDados", "BaseDados", strIniFile) & _
                              GetIniSetting("NomeBaseDados", "BaseDados", strIniFile)
        Dim CnnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDb & ";User Id=admin;Password=;"

        fCnnString = CnnString

    End Function

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora