2009-09-16 12 views
0

J'ai énorme problème:C# + BDE + problème DBF

J'ai beaucoup de .dbf (~ 50000) et je dois les importer dans la base de données Oracle. Je ouvrir conncection comme ceci:

 OleDbConnection oConn = new OleDbConnection(); 
    OleDbCommand oCmd = new OleDbCommand(); 
    oConn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + directory + ";Extended Properties=dBASE IV;User ID=Admin;Password="; 
      oCmd.Connection = oConn; 
      oCmd.CommandText = @"SELECT * FROM " + tablename; 
     try 
      { 
       oConn.Open(); 
       resultTable.Load(oCmd.ExecuteReader()); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
       } 
oConn.Close(); 
oCmd.Dispose(); 
oConn.Dispose(); 

Je les lis dans la boucle, puis insérez dans Oracle. Tout va bien. MAIS: Il y a environ 1000 fichiers que je ne peux pas ouvrir. Ils soulèvent l'exception "pas un tableau". Donc, je google, et installer Borland Database Engine. Maintenant tout va bien ... mais non. Maintenant, quand je lis des fichiers, sur les exceptions d'exception de fichier 1024: "Ressource système dépassée". Mais j'ai beaucoup de ressources gratuites. Lorsque je supprime BDE, tout va bien, pas d'erreur "ressources système dépassées", mais je ne peux pas lire tous les fichiers.

Aide s'il vous plaît. PS: Essayé en utilisant ODBC mais rien ne change.

+0

"Le problème persiste même si j'utilise une connexion tout le temps", Désolé je ne peux pas être utile, le seul autre conseil que j'ai est de rechercher des défauts de fuite de mémoire avec la version du BDE que vous utilisez, ou exécuté avec un profileur de mémoire/ressource. Bonne chance pour résoudre ça. –

+0

Comment exactement utilisez-vous le BDE dans ce processus? Basé sur votre code, vous allez directement à travers les pilotes Microsoft, de sorte que vous n'auriez même jamais accéder au BDE. Comment savez-vous que les fichiers DBF qui se plaignent d'être invalides sont réellement valides? Pouvez-vous les faire ouvrir correctement dans un autre programme? –

+0

Oui. Je peux les ouvrir dans DBF Viewer 2000 sans problèmes. Pour autant que je sache après l'installation de BDE, il remplace les pilotes Microsoft. –

Répondre

1

Je remarque que vous utilisez Jet oledb fournisseur pour vous connecter à vos fichiers dbf, je ne sais pas si cela va résoudre votre problème ou pas, mais il est an oledb provider for visual FoxPro que je pense que vous pouvez utiliser pour se connecter aux fichiers dbf.

+0

Même problème avec OleDb VFP - "pas une table". –

0

Différentes versions de DBF (dBASE, Clipper, FoxPro) sont similaires, avec une exception notable: DBF7, introduit avec Visual dBASE 7 et alimenté par BDE. DBF Viewer 2000 prétend supporter DB7, probablement nativement puisque le format n'est pas si compliqué. Peut-être qu'il y a des propriétés/informations de fichier que vous pouvez voir pour confirmer que tous les DBF "not a table" sont DBF7.

Même si cela s'avère pour définir la nature du problème, je ne vois pas une solution particulièrement simple. S'il s'agit d'une transaction unique, vous pouvez peut-être exécuter la boucle, enregistrer les noms des fichiers «1000» qui ne fonctionnent pas sans le BDE installé et effectuer un second passage avec le BDE. (Si c'est plus de 1024, vous aurez besoin d'un troisième passage.)

0

J'ai un module Python qui peut extraire des données de la plupart des fichiers DBF, y compris DBF7, dont la structure est quelque peu différente. Il n'a pas besoin de pilotes, OleDb ou ODBC - il lit juste le fichier. Il vérifie très soigneusement les fichiers d'entrée et donne des messages beaucoup plus détaillés que "pas un tableau" s'il n'est pas content. Pouvez-vous faire quelques exemples de fichiers disponibles pour l'inspection?

0

J'ai eu des problèmes similaires avec les fichiers DBF, où je recevais des messages «Dépassement des ressources système» de temps en temps. Pour moi, la solution consistait à créer un wrapper DLL Delphi autour de BDE (appels standard Delphi TQuery) et à appeler cette DLL à partir de C# en utilisant Interop.