2013-10-09 7 views
0

Je rencontre des problèmes lors de la création de fichiers dbf lors de l'exportation de données de fichier de formes. La plupart du temps ça marche, mais parfois, il vous reste plus qu'à Trow l'erreur suivante, même si le fichier n'existe pas encore:La création d'un fichier dBase génère sporadiquement une exception

Le moteur de base de données Microsoft Jet ne peut pas ouvrir le fichier « C: \ Test \ 258ba2f1 -cc05-4a21-a047-ef060c46a3ca \ data \ nom_table.DBF '. Il est déjà ouvert exclusivement par un autre utilisateur, ou vous avez besoin d'une autorisation pour afficher ses données.

Le code ressemble à ceci:

using (var dBaseConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + databasePath + ";Extended Properties=dBASE IV;")) 
     { 
      var createTableString = "Create Table " + tableName + ".dbf (p_id char(10), answered char(20), mnote char(50), descr char(50), grade char(50))"; 

      var cmd = new OleDbCommand(createTableString, dBaseConnection); 

      dBaseConnection.Open(); 
      cmd.ExecuteNonQuery(); 

Cela se produit uniquement lorsque j'utilise le moteur de base de données Microsoft Jet. L'utilisation de Visual FoxPro crée une colonne supplémentaire nommée "_NullFlags" et le fichier dbf ne fonctionne avec aucun logiciel SIG.

Des idées?

Répondre

1

Ce que vous pouvez faire est d'avoir toujours une structure de table "modèle" disponible et jamais utilisée en production. Ensuite, il suffit de copier cette table de modèles pour tout ce que votre nouveau nom de table devrait être. Ensuite, vous pouvez interroger et vous connecter et faire n'importe quoi avec cette version de fichier. En outre, vous pouvez renommer l'extension de fichier de .DBF à n'importe quoi, tel que YourTable.GISDBF ainsi aucune autre application ne l'ouvrirait accidentellement.

Toutefois, si cela ne fonctionne pas pour vous, vous pouvez regarder another post J'ai répondu il y a assez longtemps à des problèmes avec le moteur Jet aussi. Dans ce cas, j'utilise le pilote VFP OleDb et j'utilise ExecScript(). Vous pouvez écrire des instructions de ligne de commande, puis les exécuter comme s'il s'agissait d'un programme. En ce qui concerne la création de la table, vous pouvez toujours créer un CURSOR, puis copier dans la table de destination "TYPE FOXPLUS", ce qui le placerait dans un ancien format de fichier supporté qui pourrait également être lu par GIS.

string VFPScript = "ExecScript(" 
     + "[create cursor C_Tmp (fld1 i, fld2 c(50), fld3 c(10))] +chr(13)+chr(10)+ " 
     + "[copy to '" + YourFileNameVariable + "' type FoxPlus] "; 

// put this script into command object, then execute it... 
using (OleDbCommand comm = new OleDbCommand(VFPScript, connection)) 
{ 
    comm.ExecuteNonQuery(); 
} 
Questions connexes