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

SLIFE

[RESOLVIDO] Base de dados DBF

27 mensagens neste tópico

Boas

Estou com um problema.

Precisava de conseguir ler base de dados feitas em FoxPro (Base de dados DBF) no VB 2008!

Tenho um codigo, mas quando coloco a base de dados que quero abrir, ele diz que nao está num formato esperado!

As base de dados estão boas, pois usando o programa fox... Qualquer coisa, nao me lembro agora o nome, elas abrem e conseguimos interagir com a base de dados.

Então porque será que nao consigo o fazer atraves de um programa feito em VB??

O Codigo que tenho é este:

Declaro:

Imports System.Data.Odbc

Imports System.Data

Private Sub btnDBF_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDBF.Click

        Dim oConn As New OdbcConnection()
        oConn.ConnectionString = "Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=c:\dados\;Exclusive=No; _ 
                                                Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;"
        oConn.Open()
        Dim oCmd As OdbcCommand = oConn.CreateCommand()
        oCmd.CommandText = "SELECT * FROM c:\dados\arqDBF.dbf"
        Dim dt As New DataTable()
        dt.Load(oCmd.ExecuteReader())
        oConn.Close()

        DataGridView1.DataSource = dt

    End Sub

Tambem já experimentei este:

Dim oConn As New OleDbConnection()
oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados;Extended Properties=dBASE IV;"

oConn.Open()
Dim oCmd As OleDbCommand = oConn.CreateCommand()
oCmd.CommandText = "SELECT * FROM c:\dados\arqDBF.dbf"
Dim dt As New DataTable()
dt.Load(oCmd.ExecuteReader())
oConn.Close()
dataGridView1.DataSource = dt

Neste Desclarei:

Imports System.Data.OleDb

Imports System.Data

Alguem me consegue dizer o que poderá estar mal!

Cumprimentos

SLIFE

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei nada de connection strings, mas quando tenho problemas com elas costumo usar este site:

http://connectionstrings.com/

OLE DB, OleDbConnection (.NET)

Standard

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\folder;Extended Properties=dBASE IV;User ID=Admin;Password=;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SIm, como o pmg  já disse, é preferivel usar uma ligação OleDb do que ODBC.

Exemplo:

Using connection as new OleDbConnection("Provider=VFPOLEDB.1;Data Source=C:\My Documents\Visual FoxPro Projects;Password='';Collating Sequence=MACHINE")
     connection.Open()
     ' código
End Using

Tens aqui também um link interessante da MSDN

http://msdn.microsoft.com/en-us/library/aa977082(VS.71).aspx

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SIm, como o pmg  já disse, é preferivel usar uma ligação OleDb do que ODBC.

Exemplo:

Using connection as new OleDbConnection("Provider=VFPOLEDB.1;Data Source=C:\My Documents\Visual FoxPro Projects;Password='';Collating Sequence=MACHINE")
     connection.Open()
     ' código
End Using

Tens aqui também um link interessante da MSDN

http://msdn.microsoft.com/en-us/library/aa977082(VS.71).aspx

Boas jpaulino

Será que poderias dar um exemplo de como poderei fazer isso neste codigo:

Dim oConn As New OdbcConnection()
        oConn.ConnectionString = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=C:\3BCWIN\DADOS\023art01.dbf;Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;"
        oConn.Open()
        Dim oCmd As OdbcCommand = oConn.CreateCommand()
        oCmd.CommandText = "SELECT * FROM C:\3BCWIN\DADOS\023art01.dbf"
        Dim dt As New DataTable()
        dt.Load(oCmd.ExecuteReader())
        oConn.Close()

        DataGridView1.DataSource = dt

Neste codigo dá o erro de:

ERROR [iM001] [Microsoft][Gestor de controladores de ODBC] O controlador não suporta esta função

E fica parado no debug em cima de  oConn.Open().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá, não tenho aqui nenhuma base de dados para testar, mas é +/- isto:

        Dim connString As String = "Provider=VFPOLEDB.1;Data Source=C:\3BCWIN\DADOS;Collating Sequence=MACHINE"
        Using connection As New OleDb.OleDbConnection(connString)
            connection.Open()

            Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM C:\3BCWIN\DADOS\023art01.dbf", connection)
            Dim ds As New DataSet
            da.Fill(ds)

            Me.DataGridView1.DataSource = ds.Tables(0).DefaultView
        End Using

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá, não tenho aqui nenhuma base de dados para testar, mas é +/- isto:

        Dim connString As String = "Provider=VFPOLEDB.1;Data Source=C:\3BCWIN\DADOS;Collating Sequence=MACHINE"
        Using connection As New OleDb.OleDbConnection(connString)
            connection.Open()

            Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM C:\3BCWIN\DADOS\023art01.dbf", connection)
            Dim ds As New DataSet
            da.Fill(ds)

            Me.DataGridView1.DataSource = ds.Tables(0).DefaultView
        End Using

Experimentei e deu-me o seguinte erro:

O fornecedor 'VFPOLEDB.1' não está registado no computador local.

O que poderá ser?

Se podesses eu enviava-te a uma base de dados para poderes testar! Se nao for pedir muito claro!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Testaste a connection string que o pmg mostrou ?

Sim tentei!

E ja tentei  outras que estao no site que o pmg disse!

Mas nao estou a conseguir!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já recebi a base de dados mas também não estou a conseguir! Só tinha feito testes com versões mais antigas.

Só tens esse ficheiro ? É que nas ultimas versões (na 9 pelo menos) o ficheiro é dbc.

Tens o OleDb Provider instalado?

http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en

Boas

Desculpa nao ter respondido mais nada ontem, mas tive que sair!

Tenho mais base de dados, mas sao todas como essa! Apenas campos diferentes.

Queres que te envie mais alguma base de dados?

Queres que te envie o Foxcmd? Para poderes abrir a base de dados, e verificar que esta tudo bem com esta?

Edit: Instalei o que disses-te, e ficou-me a pedir um ficheiro 023art01.ftp

        Coloquei 023art01.ftp na mesma pasta da base de dados, e o erro agora aparece noutra linha que é:

       

        da.fill(ds)

      Com este erro:

      O fornecedor não conseguiu determinar o valor Decimal. Por exemplo, a linha acabou de ser criada, a predefinição para a coluna Decimal não 

      estava disponível e o cliente ainda não tinha definido um novo valor Decimal.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas

Desculpa nao ter respondido mais nada ontem, mas tive que sair!

Tenho mais base de dados, mas sao todas como essa! Apenas campos diferentes.

Queres que te envie mais alguma base de dados?

Queres que te envie o Foxcmd? Para poderes abrir a base de dados, e verificar que esta tudo bem com esta?

Sim, talvez seja melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, agora já funciona!  Bem me parecia que faltava alguma coisa ;)

Tens de ter os dois ficheiros na mesma localização (.dbf e .fpt). Estavas a usar um ficheiro 023art01.dbf e enviaste-me agora outro como o respectivo *.fpt. Assim já trabalha (eu coloquei tudo no C:\)

        Dim connString As String = "Provider=VFPOLEDB.1;Data Source=C:\;Collating Sequence=MACHINE"
        Using connection As New OleDb.OleDbConnection(connString)
            connection.Open()
            Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM 023fam01.dbf", connection)
            Dim ds As New DataSet
            da.Fill(ds)
            Me.DataGridView1.DataSource = ds.Tables(0).DefaultView
        End Using

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, agora já funciona!  Bem me parecia que faltava alguma coisa :D

Tens de ter os dois ficheiros na mesma localização (.dbf e .fpt). Estavas a usar um ficheiro 023art01.dbf e enviaste-me agora outro como o respectivo *.fpt. Assim já trabalha (eu coloquei tudo no C:\)

        Dim connString As String = "Provider=VFPOLEDB.1;Data Source=C:\;Collating Sequence=MACHINE"
        Using connection As New OleDb.OleDbConnection(connString)
            connection.Open()
            Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM 023fam01.dbf", connection)
            Dim ds As New DataSet
            da.Fill(ds)
            Me.DataGridView1.DataSource = ds.Tables(0).DefaultView
        End Using

Boas

Sim já consigo aceder a base de dados!

Porreiro!

Só mais uma coisa, o comando update irá funcionar?

Ou só funciona o comando Select?

Se funcionar o comando Update, como poderei colocar a instrução SQL?

É a opção Select tem * from e nome da tabela!

E o UPDATE sabes como poderei fazer?

Edit: Já fiz o Update. (UPDATE 023fam01.dbf set estado=1) Funcionou!

Existe alguma maneira de colocar uma msg a avisar que o update tenha sido concluido ou feito com sucesso?

Obrigadao jpaulino

Mesmo muito obrigado, perdi horas de volta disto!

Só mais uma coisa, tive que instalar o que me falas-te mais acima!

Agora se colocar esta opçao no meu programa, as maquinas de destino tambem teram que ter o OleDb Provider instalado?

Ou nao será necessário?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Existe alguma maneira de colocar uma msg a avisar que o update tenha sido concluido ou feito com sucesso?

Quando fazes o update utilizas um executenonquery() e esse commando pode retornar o número de registos afectados, do tipo:

Dim result As Integer = command.ExecuteNonQuery()

e depois vês se o resultado for igual a 1 é porque inseriu.

Agora se colocar esta opçao no meu programa, as maquinas de destino tambem teram que ter o OleDb Provider instalado?

Ou nao será necessário?

É necessário instalar sim.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando fazes o update utilizas um executenonquery() e esse commando pode retornar o número de registos afectados, do tipo:

Dim result As Integer = command.ExecuteNonQuery()

Onde coloco isso??

É que coloquei no codigo que me deste em cima mas dá erro.

Diz:' ExecuteNonQuery' não é membro de 'string'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Edit: Já fiz o Update. (UPDATE 023fam01.dbf set estado=1) Funcionou!

Mostra o código com que fizeste isto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra o código com que fizeste isto.

Fiz Isto:

   Dim connString As String = "Provider=VFPOLEDB.1;Data Source=C:\dados;Collating Sequence=MACHINE"
        Using connection As New OleDb.OleDbConnection(connString)
            connection.Open()
            Dim da As New OleDb.OleDbDataAdapter("UPDATE 023fam01.dbf set estado=2", connection)
            Dim ds As New DataSet
            da.Fill(ds)
           
        End Using

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiz Isto:

Mas fizeste mal  :D

Tenta assim (não testado!)

        Dim connString As String = "Provider=VFPOLEDB.1;Data Source=C:\dados;Collating Sequence=MACHINE"
        Using connection As New OleDb.OleDbConnection(connString)
            connection.Open()
            Dim command As New OleDb.OleDbCommand("UPDATE 023fam01.dbf set estado=2", connection)
            Dim result As Integer = command.ExecuteNonQuery()

            If result > 0 Then
                Debug.WriteLine("Actualizado com sucesso!")
            End If

        End Using

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas fizeste mal  :D

Tenta assim (não testado!)

        Dim connString As String = "Provider=VFPOLEDB.1;Data Source=C:\dados;Collating Sequence=MACHINE"
        Using connection As New OleDb.OleDbConnection(connString)
            connection.Open()
            Dim command As New OleDb.OleDbCommand("UPDATE 023fam01.dbf set estado=2", connection)
            Dim result As Integer = command.ExecuteNonQuery()

            If result > 0 Then
                Debug.WriteLine("Actualizado com sucesso!")
            End If

        End Using

Boas

Nao da a mensagem de actualização!

Estive a ver em modo debug, e o result está sempre igual a 0.

Mas actualiza a base de dados!

De resto está tudo a funcionar bem!

No codigo acima, Como posso utilizar um try e um catch para se existir algum erro, poder ser avisado!

Um abraço

SLIFE

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nao da a mensagem de actualização!

Estive a ver em modo debug, e o result está sempre igual a 0.

Mas actualiza a base de dados!

De resto está tudo a funcionar bem!

No codigo acima, Como posso utilizar um try e um catch para se existir algum erro, poder ser avisado!

Um abraço

SLIFE

É estranho! Mas também nunca testei dbf's

Para o Try Catch é simples, colocas tudo dentro do Try Catch e no final uma mensagem.

Vê este exemplo: Tratamento de Erros

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas jpaulino

Desculpa estar a escrever num topico que já considerei encerrado, mas surgiu um problema!

Lembras-te da primeira base de dados que te enviei, a de art, entao o que se passa é que com o exemplo que me deste consigo abrir todas as base de dados menos essa!

Dá erro, dizendo que o valor decimal nao está correcto. Mas com o foxcmd consigo a abrir!

É estranho nao achas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não posso testar porque só me enviaste um ficheiro.

Envia os dois que eu testo depois.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não posso testar porque só me enviaste um ficheiro.

Envia os dois que eu testo depois.

Boas

Ainda não conseguis-te descobrir nada sobre a base de dados que te enviei?

Tenho andado a tentar mas ainda não consegui nada!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não consigo também mas também não estou a conseguir usar o foxcmd. Vê se existe algum problema com a estrutura ou com os dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não consigo também mas também não estou a conseguir usar o foxcmd. Vê se existe algum problema com a estrutura ou com os dados.

Nao estas a conseguir usar o foxcmd?  (trocas-te a extensão do ficheiro para .exe)?

Algum erro?

Arranca ou nem isso faz?

Estive a ver a estrutura dos dados com o foxcmd, e aparentemente está tudo bem!

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