2012-05-31 2 views
1

Cher communauté Stackoverflow,Erreur d'exécution de Visual Studio 2010 et FoxPro 9.0 Erreur: "La fonction n'est pas disponible."

Je suis un peu confus en utilisant la bibliothèque VFPOleDb (9.0Sp2) dans Visual Studio 2010 avec le profil client .NET 4.0. Que dois-je faire? Modifier les fichiers existants et créer de nouveaux fichiers de base de données FoxPro en utilisant C#.

Essayer de compiler mon propre exemple et se basant sur les exemples vus dans « Comment créer un fichier DBF à partir de zéro en C# » (1), « Comment puis-je lire une base de données FoxPro 8.0 de C# » (2) et " Programmation de la base de données avec Visual FoxPro "(3) Je reçois une erreur de compilation:" Fonction non disponible ". Empiler le message d'exception me montre que la fabrique OleDbConnection ne reconnaît pas la chaîne de connexion? J'ai déjà ajouté 'Interop.VFPOLEDBLib' comme référence, mais je n'ai pas pu ajouter 'vfpoledb.dll' à cause d'un fichier manifeste manquant?

code-Exemple

using System; 
using System.IO; 
using System.Data; 
using System.Data.Odbc; 
using System.Data.OleDb; 
using System.Data.Common; 


    namespace VFPExample 
    { 

     class VFPExample 
     { 
      /* 
      https://stackoverflow.com/questions/754436/odbc-dbf-files-in-c-sharp/ 

      http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic62548.aspx 
      */ 

      static void Main(String[] args) 
      { 

       { 
        string strTestDirectory = @"Provider=VFPOLEDB.1; DataSource=D:\TEMP\"; 

        using (OleDbConnection vfpro_con_insert = 
        new OleDbConnection(strTestDirectory)) 
        { 
        vfpro_con_insert.Open(); // FIXME: Ex.Message: "Feature not available"; 

        OleDbCommand createTable = new OleDbCommand(@"Create Table TestDBF (Field1 I, Field2 C(10))", vfpro_con_insert); 
        OleDbCommand insertTable1 = new OleDbCommand(@"Insert Into TestDBF Values (1, 'Hello')", vfpro_con_insert); 
        OleDbCommand insertTable2 = new OleDbCommand(@"Insert Into TestDBF Values (2, 'World')", vfpro_con_insert); 

        createTable.ExecuteNonQuery(); 
        insertTable1.ExecuteNonQuery(); 
        insertTable2.ExecuteNonQuery(); 

        Console.WriteLine("Wrote in " + vfpro_con_insert.DataSource); 
        } 

        Console.ReadLine(); 

        /* 
       -------------------------------------------------------------------------------- 
        */ 

        using (OleDbConnection vfpro_con_read = new OleDbConnection(strTestDirectory)) 
        { 
         vfpro_con_read.Open(); 

         OleDbCommand readTable = new OleDbCommand("Select * From TestDBF (Field1 I, Field2 C(10))", vfpro_con_read); 

         OleDbDataAdapter da = new OleDbDataAdapter(readTable); 

         DataSet ds = new DataSet(); 
         // DataRow dr = new DataRow(); 

         da.Fill(ds); 

         foreach (DataRow dr in ds.Tables[0].Rows) 
         { 
          Console.WriteLine(dr.ItemArray[1].ToString()); 
         } 

        } 

        Console.ReadLine(); 

       } 
       catch (Exception e) 
       { 
        Console.WriteLine("\n\n Exception:\n\n{0}", e.Message); // Set Breakpoint here for detailed StackTrace 
       } 
      } 

     } 
    } 

StackTrace

> e {"Feature is not available."} System.Exception {System.Data.OleDb.OleDbException} 
>  [System.Data.OleDb.OleDbException] 
>  {"Feature is not available."} 
>  System.Data.OleDb.OleDbException 
> Data {System.Collections.ListDictionaryInternal} 
>  System.Collections.IDictionary {System.Collections.ListDictionaryInternal} 
> HelpLink null string 
> InnerException null System.Exception 
> Message "Feature is not available." string 
> Source "Microsoft OLE DB Provider for Visual FoxPro" string 
> StackTrace " 
> at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) 
> at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) 
> at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) 
> at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
> at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
> at System.Data.OleDb.OleDbConnection.Open() 
> at bestsellerList.VFPExample.Main(String[] args) 
> in D:\Visual Studio 2010\Projects\VFPExample\VFPExample.cs:Line 37." string 
> TargetSite {Void .ctor(System.Data.OleDb.OleDbConnectionString, System.Data.OleDb.OleDbConnection)} System.Reflection.MethodBase {System.Reflection.RuntimeConstructorInfo} 
> Static Member  
> No(t) public Member   
> e.Message "Feature is not available." string 

(ai essayé de fixer la localisation)

Je besoin de quelques éclaircissements sur vfpoledb/Visual FoxPro dans Visual Studio:

  • La bibliothèque Visual FoxPro est-elle uniquement prise en charge avec .NET Client Profile 2.0 et/ou Visual Studio 2003/5 (et versions antérieures)? En outre, je peux clairement voir que VSFoxPro (5) a atteint son cycle de vie de fin de produit (4) - au moins pour le support Mainstream. Le support étendu est toujours accordé jusqu'en 2015. Existe-t-il d'autres documents (semi) officiels ou entrées de blog de Microsoft concernant la migration des bases de données FoxPro? Déjà vu "Migration à partir de Visual FoxPro" (6).

  • Existe-t-il des compilations réussies avec .NET 3.x (profil client) et supérieur?

  • Que manque-t-il dans mon exemple de code et/ou Reference dans Visual Studio?


Alors, je pris l'exemple de code, il a modifié à mes besoins - lire une table avec six colonnes et beaucoup, beaucoup de lignes est exportée sous forme de fichier csv; fonctionne bien sur ma machine locale (comme d'habitude, comme nous le savons tous) - et copié l'exécutable à un Windows 2008 Server R2 avec .NET 3.5.x installé et essayé de démarrer l'application. Avez-vous déjà fait une supposition bien éduquée?

Encore une fois je reçois la même exception que la première fois, mais cette fois-ci ressemble que

  DataSet ds = new DataSet(); 
      da.Fill(ds); // throws Exception 

da.Fill(ds) est le fauteur de troubles, mais cela n'a vraiment aucun sens pour moi, parce que je aussi copié le exemple- compilé application basée sur le code corrigé au serveur et il fait juste ce qu'il est censé faire ...

Merci pour tous les conseils.

Exception

System.Data.OleDb.OleDbException: Feature is not available. 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) 
    at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) 
    at Program.Main(String[] args) 


System.Collections.ListDictionaryInternal 

    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) 
    at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) 
    at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
    at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) 
    at Program.Main(String[] args) 

Répondre

1

L'exception "Fonction non disponible" est due à une chaîne de connexion incorrecte. Utilisez "Source de données" au lieu de "DataSource."

+0

Vous avez raison. J'ai manqué le blanc dans 'Data Source' et cela a provoqué l'Exception. – hal

0

Je l'ai utilisé vfpoledb en utilisant l'application WPF de construction VS2010 sans problème ... Je suis en cours d'exécution sur une machine de développement 32 bits bien. VFP ne prend pas en charge la PERIODE 64 bits et ne sait pas si cela PEUT être ce que vous rencontrez.

Egalement ... le chemin "D: \ TEMP" existe-t-il? Il n'essaiera pas automatiquement de créer un chemin, mais cela me semblerait lancer une erreur différente.

Vous pouvez également supprimer System.Data.ODBC et System.Data.Common, je ne pense pas que ceux-ci sont nécessaires dans l'exemple que vous travaillez.

Je n'ai pas de référence d'ajout explicite de 'Interop.VFPOLEDBLib'. De ce que j'ai rencontré, juste avoir le System.Data et ce que vous avez de

using System.Data; 
using System.Data.OleDb; 

devrait être bon aller. Le fournisseur OleDB examinera réellement ce qui est «enregistré» quand il essaye de charger le «fournisseur = VFPOLEDB.1; portion.

Cela dit, je commencerais en le rendant encore plus simple, ... juste essayer d'ouvrir la connexion, puis fermez-

static void Main(String[] args) 
{ 
    string strTestDirectory = @"Provider=VFPOLEDB.1; DataSource=D:\TEMP\"; 

    OleDbConnection VFPConn = new OleDbConnection(strTestDirectory); 
    VFPConn.Open(); 
    if(VFPConn.State == System.Data.ConnectionState.Open) 
     VFPConn.Close(); 
} 

voir si cela tombe en panne ... si oui, vous savez qu'il a rien d'autre à faire avec aucune autre préparation de créer, insérer, sélectionner, mais explicitement la connexion.

+0

Désolé - je suis pas clair quant à ce que vous entendez par « VFP ne supporte pas 64 bits - PÉRIODE » Les deux IDE et les applications produites avec elle fonctionner parfaitement bien et sont pris en charge 64 bits Les fenêtres. Ou vouliez-vous dire quelque chose d'autre? –

+0

@AlanB, il peut être rétro-pris en charge pour un 64-bit pour appeler/exécuter le 32 bits, mais VFP ne sera pas en mesure de tirer parti de 64 bits .. ie: valeur numérique max, 32 bits, enregistrements par table toujours limitée à 2 gig par fichier unique, etc. – DRapp

+0

Oui c'est vrai, mais c'est aussi vrai d'un grand pourcentage de tout ce qui fonctionne sur Windows 64 bits à l'heure actuelle qui n'a pas de 64 bits natif exécutable La limite de 2 Go était là bien avant 64 bits et est une fonction du mécanisme de verrouillage de fichier hérité utilisé. Numéros de 32 bits, oui, à quelle fréquence est-ce un problème avec un produit de développement? Bottom line: Il est aussi supporté (jusqu'en 2014) que toute autre application 32 bits sur Windows 64 bits. –

1

J'ai corrigé le code comme proposé, nettoyé et amélioré certaines parties mineures. Ça marche.

using System; 
using System.IO; 
using System.Data; 
using System.Data.Odbc; 
using System.Data.OleDb; 
using System.Data.Common; 

namespace VFPExample 
{ 
    class VFPExample 
    { 
     /* 
     * http://stackoverflow.com/questions/754436/odbc-dbf-files-in-c-sharp/ 
     * http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic62548.aspx 
     */ 
     static void Main(String[] args) 
     { 
      try 
      { 
       string strTestDirectory = @"Provider=VFPOLEDB.1; Data Source=D:\TEMP\"; 

       using (OleDbConnection vfpro_con_insert = new OleDbConnection(strTestDirectory)) 
       { 
        vfpro_con_insert.Open(); 

        OleDbCommand createTable = new OleDbCommand(@"Create Table TestDBF (Field1 N(2,0), Field2 C(10))", vfpro_con_insert); 
        OleDbCommand insertTable1 = new OleDbCommand(@"Insert Into TestDBF (Field1, Field2) Values (1, 'Hello')", vfpro_con_insert); 
        OleDbCommand insertTable2 = new OleDbCommand(@"Insert Into TestDBF (Field1, Field2) Values (2, 'World')", vfpro_con_insert); 

        createTable.ExecuteNonQuery(); 
        insertTable1.ExecuteNonQuery(); 
        insertTable2.ExecuteNonQuery(); 

        Console.WriteLine("Wrote in " + vfpro_con_insert.DataSource); 
       } 

       Console.ReadLine(); 

       using (OleDbConnection vfpro_con_read = new OleDbConnection(strTestDirectory)) 
       { 
        Console.WriteLine("Read from " + vfpro_con_read.DataSource); 

        vfpro_con_read.Open(); 

        OleDbCommand readTable = new OleDbCommand(@"Select * From TestDBF", vfpro_con_read); 

        OleDbDataAdapter da = new OleDbDataAdapter(readTable); 

        DataSet ds = new DataSet(); 

        da.Fill(ds); 

        foreach (DataRow dr in ds.Tables[0].Rows) 
        { 
         Console.WriteLine(dr.ItemArray[1].ToString()); 
        } 
       } 
       Console.ReadLine(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("\n\n Exception:\n\n{0}", e.Message); // Set Breakpoint here for detailed StackTrace 
      } 
     } 
    } 
} 
+0

Wow! Parfait! Exactement ce dont j'avais besoin et j'ai cherché haut et bas. J'ai eu la chaîne de connexion, j'ai eu la requête, je ne savais pas comment je peux extraire des données de ces bases de données FoxPro. Merci! +1 – Lukas

Questions connexes