2012-05-31 1 views
1

Уважаемый пользователь сообщества Stackoverflow,Visual Studio 2010 и FoxPro 9.0 Ошибка выполнения: «Функция недоступна».

Я немного запутался, используя библиотеку VFPOleDb (9.0Sp2) в Visual Studio 2010 с профилем клиента .NET 4.0. Что я хочу делать? Отредактируйте существующие и создайте новые файлы базы данных FoxPro с помощью C#.

Пытаясь собрать свой собственный пример и основанный на примерах, замеченных в «Как создать DBF файл с нуля в C#» (1), «Как я прочитал базы данных FoxPro 8.0 из C#» (2) и " Программирование базы данных с помощью Visual FoxPro "(3) Я получаю ошибку компиляции:« Функция недоступна ». Stacktracing Exception Message показывает мне, что OleDbConnection Factory не распознает строку подключения? Я уже добавил «Interop.VFPOLEDBLib» в качестве ссылки, но мне не удалось добавить «vfpoledb.dll» из-за отсутствующего файла манифеста?

Код-Пример

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 

(Пытался исправить локализации)

Так мне нужны некоторые пояснения относительно VFPOleDb/Visual FoxPro в Visual Studio:

  • Является ли библиотека Visual FoxPro поддерживаемой только с .NET Client Profile 2.0 и/или Visual Studio 2003/5 (и ранее)? Кроме того, я ясно вижу, что VSFoxPro (5) достиг своего жизненного цикла продукта (4) - по крайней мере, для поддержки Mainstream. Расширенная поддержка по-прежнему предоставляется до 2015 года. Есть ли какие-либо другие (полу) официальные документы или записи в блогах Microsoft относительно миграции баз данных FoxPro? Уже видели «Миграция с Visual FoxPro» (6).

  • Есть ли успешные компиляции с .NET 3.x (профиль клиента) и выше?

  • Что мне не хватает в моем примере кода и/или ссылке в Visual Studio?


Итак, я взял пример-кода, изменения его к моим потребностям - читать одну таблицу с шестью колонками и много, много строк, которые экспортируется в файл CSV; отлично работает на моей локальной машине (как обычно, как мы все знаем) - и скопировал исполняемый файл на Windows 2008 Server R2 с установленным .NET 3.5.x и попытался запустить приложение. Вы уже хорошо поняли?

Еще раз я получаю то же исключение, как в первый раз, но на этот раз, похоже, что

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

da.Fill(ds) является нарушителем, но это не делает действительно никакого смысла для меня, потому что я также скопировал скомпилированный ПРИМЕР- приложение, основанное на исправленном коде на сервере, и оно просто делает то, что он должен делать ...

Спасибо за любые подсказки.

Исключения

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) 

ответ

1

Исключением «Функция недоступна» является неправильная строка подключения. Вместо «DataSource» используйте «Источник данных».

+0

Вы правы. Я пропустил пробел в «Источнике данных», и это вызвало исключение. – hal

0

Я использовал VFPOleDb с помощью VS2010 здания WPF приложения без проблем ... Я бег на машине разработки в 32-битной, хотя. VFP НЕ поддерживает 64-битный PERIOD и не знает, будет ли это МОЖЕТ быть тем, с чем вы сталкиваетесь.

Также существует ли путь «D: \ TEMP»? Он не будет автоматически пытаться создать путь, но это может показаться мне как ошибка.

Вы также можете удалить System.Data.ODBC и System.Data.Common, я не думаю, что они нужны в образце, который вы работаете.

У меня также нет явной ссылки на ссылку «Interop.VFPOLEDBLib». Из того, с чем я столкнулся, просто наличие System.Data и того, что у вас есть

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

должно быть хорошо. Поставщик OleDB фактически рассмотрит, что «зарегистрировано», когда он пытается загрузить «Provider = VFPOLEDB.1;»; часть.

То есть, я хотел бы начать, сделав его еще более простым ... просто попытаться открыть соединение, а затем закрыть его

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(); 
} 

увидеть, если это происходит сбой ... если да, то вы знаете, что есть больше ничего не делать с другой подготовкой создания, вставки, выбора, но явно подключения.

+0

К сожалению - я неясно, что вы подразумеваете под «VFP не поддерживает 64-разрядную - ПЕРИОДА» Оба IDE и приложения, полученные с ним работать отлично и поддерживаются на 64-разрядных Окна. Или вы имели в виду что-то еще? –

+0

@AlanB может поддерживаться в обратном порядке для 64-битного вызова/запуска 32-разрядного, но VFP не сможет воспользоваться 64-битным .. то есть: максимальное числовое значение, 32-разрядные, записи в таблице по-прежнему ограничено 2-гигабайт на один файл и т. д. – DRapp

+0

Да, это правда, но это также относится к большому проценту всего, что работает на 64-битной Windows в текущее время, в котором нет собственного 64-битного исполняемый файл. Предел 2 ГБ был там задолго до 64-бит и является функцией старого механизма блокировки файлов. 32-разрядные числа, да, как часто это проблема с каким-либо продуктом разработки? Итог: он поддерживается (до 2014 года), как и любое другое 32-разрядное приложение в 64-битной Windows. –

1

Я исправил код, как было предложено, очистил его и улучшил некоторые мелкие детали. Оно работает.

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

Вау! Отлично! Именно то, что мне нужно, и я искал высоко и низко. У меня была строка подключения, у меня был запрос, я просто не знал, как я могу извлечь данные из этих баз данных FoxPro. Спасибо! +1 – Lukas