2010-02-17 10 views
3

J'utilise pilote vfpoledb pour lire les fichiers DBF et je continue à obtenir cette erreur et je ne sais pas pourquoi et comment résoudre le problème:lecture DBF avec chauffeur vfpoledb

Le fournisseur n'a pas pu déterminer la valeur décimale . Par exemple, la ligne a été créée, la valeur par défaut de la colonne Decimal n'était pas disponible et le consommateur n'avait pas encore défini de nouvelle valeur Decimal.

Voici le code. J'appelle cette routine pour retourner un DataSet du fichier DBF et afficher les données dans un DataGridView.

public DataSet GetDBFData(FileInfo fi, string tbl) 
    { 
     using (OleDbConnection conn = new OleDbConnection(
     @"Provider=VFPOLEDB.1;Data Source=" + fi.DirectoryName + ";")) 
     { 
      conn.Open(); 
      string command = "SELECT * FROM " + tbl; 
      OleDbDataAdapter da = new OleDbDataAdapter(command, conn); 
      DataSet ds = new DataSet(); 
      da.Fill(ds); 
      return ds; 
     } 
    } 

Répondre

0

J'ai finalement résolu le problème en obtenant le schéma de la table, puis en convertissant tous les champs sans caractère en varchar dans l'instruction select. Assez bon pour prévisualiser le contenu de la table.

0

Si vous ajoutez une ligne à partir de votre gridview, il n'utilise pas nécessairement une valeur par défaut, mais plutôt NULLs, vous devrez peut-être pré-définir vos paramètres par défaut, ou définir le schéma pour ne pas autoriser les valeurs nulles.

Vous pouvez automatiser à travers les colonnes après la requête est effectuée et les valeurs par défaut de force sur la base des types de données de colonnes, telles que

foreach (DataColumn oDC in YourDataSet.Tables[0].Columns) 
{ 
    if (oDC.DataType.ToString().Contains("String")) 
    oDC.DefaultValue = ""; 
    else if (oDC.DataType.ToString().Contains("Int32")) 
    oDC.DefaultValue = 0; 
    else if (oDC.DataType.ToString().Contains("DateTime")) 
    oDC.DefaultValue = DateTime.MinValue; 
} 

ce ne sont que 3 types par défaut, mais il pourrait y avoir d'autres comme booléen, décimal , float, any, juste ajouter dans le if/else et mettre les valeurs "par défaut". Il PEUT aider lorsque des valeurs "NULL" sont injectées lors de l'ajout de nouvelles lignes.

+0

Comment est-ce que je préréglage mes valeurs par défaut? J'essaie de prévisualiser le contenu d'un fichier DBF arbitraire. –

+0

Merci pour la suggestion, mais je ne peux même pas obtenir un DataSet et mon code se bloque à da.Fill (ds); –

+0

voir mon exemple de code dans un autre post à http://stackoverflow.com/questions/2184490/search-in-dbf-file-using-idx-file/2184598#2184598 le titre du sujet était Rechercher dans le fichier DBF en utilisant le fichier .idx – DRapp

0

Il est un problème connu. Surtout, si vous devez sélectionner toutes les colonnes, il est beaucoup plus confortable:

Select * from some_table 

Une solution de travail est d'utiliser un autre fournisseur, par exemple Microsoft.Jet.OLEDB.4.0. Exemple de chaîne de connexion peut être trouvé ici: http://docs.30c.org/conn/dbf-foxpro.html