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.
Cela semble être un problème, mais n'explique pas tous les problèmes. –