2009-03-30 17 views
6

Dans le cadre d'un projet sur lequel je travaille en C#, j'ai besoin de lire un fichier .dbf. La première chose que je veux faire est d'obtenir la table de schéma du fichier. J'ai un code qui fonctionne tant que le nom de fichier (sans l'extension) ne dépasse pas 8 caractères. Par exemple, disons que j'ai un fichier nommé MyLongFilename.dbf. Par exemple, disons que j'ai un fichier nommé MyLongFilename.dbf. Le code suivant ne fonctionne pas; il lève l'exception suivante: "Le moteur de base de données Microsoft Jet n'a pas pu trouver l'objet" MyLongFilename ". Assurez-vous que l'objet existe et que vous épeler son nom et le nom de chemin correctement. »Comment utiliser la méthode GetOleDbSchemaTable sur un fichier dbf de nom long

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongFilename;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

Pour franchir cette exception, l'étape suivante consiste à utiliser un nom du OldDbConnection aime (« MyLongF ~ 1 » au lieu de 'MyLongFilename'), ce qui conduit à ceci:

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongF~1;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

cela ne retourne avec succès un OleDbConnection. Maintenant, pour obtenir la table de schéma, j'essaie ce qui suit:

connection.Open(); 
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, 
    new object[] { null, null, fileNameNoExt, null }); 

Cela renvoie un DataTable sans lignes. Si je renomme le nom de fichier en 8 caractères ou moins, alors ce code fonctionne et je récupère une ligne pour chaque champ de la base de données.

Avec le nom de fichier long, je sais que la connexion retournée est valide parce que je peux l'utiliser pour remplir un DataSet comme ceci:

string selectQuery = "SELECT * FROM [MyLongF~1#DBF];"; 
OleDbCommand command = new OleDbCommand(selectQuery, connection); 
connection.Open(); 
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); 
dataAdapter.SelectCommand = command; 
DataSet dataSet = new DataSet(); 
dataAdapter.Fill(dataSet); 

Cela me donne de nouveau un DataSet contenant un DataTable avec toutes les données de le fichier dbf.

Donc la question est de savoir comment puis-je obtenir juste la table de schéma pour le long fichier nommé dbf? Bien sûr, je peux contourner le problème en renommant/copiant le fichier, mais c'est un hack que je ne veux pas avoir à faire. Je ne souhaite pas non plus remplir le DataSet avec le premier enregistrement et déduire le schéma des colonnes.

Répondre

1

Eh bien, je pense que la connexion doit être

string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;Extended Properties=dBASE 5.0"; 
OleDbConnection connection = new OleDbConnection(cxn); 

et l'autre, peut-être vous devriez essayer avec un autre fournisseur, je boosté beaucoup il y a le long quand je comme ceci:

string cxn = "PROVIDER=VFPOLEDB.1;Data Source=C:\;Extended Properties=dBASE 5.0"; 

Mais vous devriez avoir VFP 7 installé

ou install Microsoft OLE DB Provider for Visual FoxPro 9.0 from here

 const string connectionString = @"Provider = vfpoledb; Data Source = {0}; Collating Sequence = general;"; 
     OleDbConnection conn = new OleDbConnection(string.Format(connectionString, dirName)); 
     conn.Open(); 
     OleDbCommand cmd = new OleDbCommand(string.Format("select * from {0}", fileName), conn); 
0

Est-ce que fileNameNoExt contient la version du nom de fichier court? En outre, MyLongF ~ 1 est 9 caractères, pas 8.

2

Selon MSDN, le dossier représente la base de données et les fichiers représentent des tables. Vous devez utiliser le chemin du répertoire sans inclure le nom de fichier dans la chaîne de connexion, puis le nom de la table dans le cadre des restrictions de GetOleDbSchemaTable.

+0

Cela semble être un problème, mais n'explique pas tous les problèmes. –

0

Si vous avez un seul fichier dbf (et éventuellement petit), vous pouvez résoudre le problème en copiant le fichier dbf ailleurs et ouvrir la copie au lieu du fichier d'origine.

0

Je crois que DataSource doit représenter le répertoire qui contient les fichiers .DBF. Chaque .Le fichier DBF correspond à une table dans ce répertoire.

Ma conjecture est c: \ MyLongF ~ 1 est un nom court pour un répertoire contenant un nom de fichier correspondant à MyLongF ~ 1 # DBF

Pouvez-vous vérifier si tel est le cas?