[VB.NET / Visual FoxPro] Connecten werkt soms wel, soms niet

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • basovic88
  • Registratie: December 2007
  • Niet online
Goede avond,

Ik ben bezig met een online product catalogus voor een klant, deze wordt gemaakt in Zend Framework. 'Achter' de online catalogus zit een MySQL database.

Echter, de klant maakt gebruikt van een inkoop/verkoop systeem dat ligt gedateerd is en werkt met een Visual FoxPro database (.DBF).

Voor het periodiek wegschrijven van nieuwe voorraden etc. van het inkoop/verkoop systeem naar de MySQL database heb ik een programma geschreven in VB.NET. Maar ik ben tegen een probleem opgelopen, namelijk mijn ODBC provider connect niet naar sommige .DBF files.

Ik krijg de volgende foutmelding:
ERROR [HY000][Microsoft][ODBC dBase Driver] External table is not in the expected format.

Via Google kom ik op oude forums terecht en daar wordt gezegd dat de betreffende ODBC driver oud is en niet alle versies goed support. Bovendien wordt vermeld dat er ook een alternatief is, namelijk de OleDb driver, maar die geeft exact dezelfde foutmelding...

Hier even de basis van het opzetten van een connectie met 'n .DBF file:

//Connectie string
My.Settings.DBFConnectionString = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\projecten\koningstuin"

//Connectie, command, adapter en reader
Public dbfcon As New OdbcConnection(My.Settings.DBFConnectionString)
Public dbfcmd As New OdbcCommand
Public dbfda As New OdbcDataAdapter("", dbfcon)
Public dbfdr As OdbcDataReader

//Openen van connectie
Public Sub OpenDBFCon()
Try
If dbfcon.State = ConnectionState.Closed Then
dbfcon.Open()
End If
Catch ex As Exception
ShowError(ex.Message & vbnewline & ex.StackTrace, "Fout")
End Try
End Sub

//Functie voor vullen van Dataset met opgegeven query
Public Function LoadDataSetDBF(ByVal sqlstr As String) As DataSet
OpenDBFCon()
Dim ds As New DataSet
Try
If dbfda.SelectCommand Is Nothing Then
dbfda = New odbcDataAdapter("", dbfcon)
End If
dbfda.SelectCommand.CommandText = sqlstr
dbfda.SelectCommand.Connection = dbfcon
dbfda.SelectCommand.ExecuteNonQuery()
dbfda.Fill(ds)
Return ds
Catch ex As Exception
ShowError(ex.Message & vbNewLine & ex.StackTrace, "Query Fout")
Finally
dbfda.Dispose()
End Try
Return Nothing
End Function

//Uiteindelijk een dataset vullen met data uit .DBF file m.b.v. query
Private m_ds as new DataSet = LoadDataSetDBF("SELECT * FROM Orders.DBF")


Nogmaals: Voor 16 van de 20 files werkt dit prima, maar voor de andere 4 krijg ik de hierboven vermelde foutmelding. Ik heb een sterk vermoeden dat het iets is m.b.t. die OBDC driver, volgens mij is er ook nog een VPFODBC driver maar deze krijg ik niet aan de praat. Bovendien zijn er verschillende soorten connection strings mogelijk......

Wie o wie heeft ervaring met dit probleem of überhaupt ervaring met FoxPro i.c.m. VB.NET en kan mij verder helpen?

Groetjes,

Bas

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Laat me raden: Accountview? (Wat een pokkepakket zeg :X )

Anyhow; ik heb in 't verleden ook wel wat zaken gedaan met Foxpro DB's in VB.net en gebruikte daarbij altijd deze ODBC driver en/of deze OLEDB driver. De connectiestring zoals jij die post heb ik nog niet gezien; ik gebruikte deze connectiestrings. Het is al weer even geleden maar ik weet wel dat elk van deze driver/connectiestrings wel weer een aantal nukken heeft die een andere dan weer niet heeft. Ik kan me niet meer precies herinneren welke wanneer wat waar goed/fout ging maar in een aantal projecten was ik noodgedwongen om bepaalde acties op driver/connectiestring-combinatie A te doen en andere acties op combinatie B. :X

Ik zou even moeten spitten (en kijken of ik er nog bij kan überhaupt) om te zien wanneer ik wat gebruikte.

Oh; code post je best tussen code tags en groeten onder je post hoeft niet ;)

[ Voor 11% gewijzigd door RobIII op 11-05-2009 23:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • basovic88
  • Registratie: December 2007
  • Niet online
Beide heb ik reeds geprobeerd. Noemenswaardig is de error die ik krijg als ik de OleDb driver gebruik:

Memo file c:\projecten\koningstuin\orders.dbf is missing or invalid!

Volgens de onderstaande site is dan het bestand corrupt geworden als gevolg van een het 'verkeerd' afsluiten van het programma (computer crash) of iets dergelijks.
http://fox.wikis.com/wc.d...oFileMissingOrInvalid~VFP

Echter, ik denk niet dat dit het probleem is. Ik heb namelijk 'n freeware stand-alone tooltje gevonden dat deze files wel kan lezen!
http://www.alexnolan.net/software/dbf.htm
Bovendien lijkt het erop dat dit tooltje ook is geschreven in .NET.

Maar goed, dat lost mijn probleem natuurlijk niet op, het enige dat ik nu weet is dat het wel mogelijk is....

Bedankt voor je reactie Roblll.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Er is weldegelijk sprake van corruptie in je database, maar sommige programma's openen DBFs op een onveilige manier (geen of verkeerde locking) of zijn niet op de hoogte van FoxPro specifieke eigenschappen. De kans is daarom ook aanwezig dat het gebruik van de verkeerde ODBC driver de database heeft gesloopt.

De foutmelding geeft aan dat een bestand met de memos (clobs) van een bepaalde tabel ontbreekt of incorrect is. Deze fout kan optreden bij problemen met filelocking bij wijzigingen aan de database, of crashen van een schrijfend proces. Je moet de database repareren (of het memobestand vanuit een backup herstellen). Het is echter al weer een tijdje geleden dat ik zoiets heb gedaan (en toen had ik altijd voorbeelden, en later een tooltje van een collega).

Zo te zien moet dit werken als het alleen een corruptie is met de bestandslengte / next-block pointer: http://social.msdn.micros...01-421e-9f71-c01a76e79864. Je hebt daarvoor echter wel een FoxPro development omgeving nodig (iig beschikbaar via MSDN).

Overigens als het om AccountView gaat zou ik contact opnemen met de makers om de database te laten repareren. Ik neem aan dat zij daar wel de expertise voor hebben en misschien zelfs een reparatie optie in AccountView zelf.

Overigens moet je met FoxPro over het algemeen niet de specifieke DBF openen, maar de database container (.DBC), aangezien een deel van de locking daarmee geregeld wordt.

[ Voor 6% gewijzigd door Remus op 12-05-2009 09:32 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
AccountView heeft ook een COM koppeling waar je de meeste gegevens gewoon mee uit kunt vragen. Wij hebben hier ook AccountView en dat is echt :X

Als dat tooltje overigens in .NET geschreven is, zou je gewoon eens met reflector kunnen kijken wat hij precies doet.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”