【问题标题】:Visual Studio 2010 and FoxPro 9.0 runtime Error: "Feature is not available."Visual Studio 2010 和 FoxPro 9.0 运行时错误:“功能不可用。”
【发布时间】:2012-06-05 22:24:36
【问题描述】:

尊敬的 Stackoverflow 社区,

在 Visual Studio 2010 中使用带有 .NET 4.0 客户端配置文件的 VFPOleDb 库 (9.0Sp2) 我有点困惑。 我想做什么?使用 C# 编辑现有的 FoxPro 数据库文件并创建新的 FoxPro 数据库文件。

尝试编译我自己的示例并基于“如何在 C# 中从头开始创建 dbf 文件”(1)、“如何从 C# 读取 FoxPro 8.0 数据库”(2 ) 和“使用 Visual FoxPro 编程数据库”(3) 我收到编译错误:“功能不可用”。 Stacktracing 异常消息显示 OleDbConnection 工厂无法识别连接字符串? 我已经添加了“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
                }
            }

        }
    }

堆栈跟踪

> 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

(试图修复本地化)

所以我需要对 Visual Studio 中的 VFPOleDb/Visual FoxPro 进行一些说明:

  • Visual FoxPro 库是否仅支持 .NET Client Profile 2.0 和/或 Visual Studio 2003/5(及更早版本)? 此外,我可以清楚地看到 VSFoxPro (5) 已达到其产品生命周期结束 (4) —— 至少对于主流支持而言。在 2015 年之前仍会提供延长支持。 Microsoft 是否有其他关于 FoxPro 数据库迁移的(半)官方文档或博客条目?已经看过“从 Visual FoxPro 迁移”(6)。

  • .NET 3.x(客户端配置文件)及更高版本是否报告了任何成功的编译?

  • 我在 Visual Studio 中的代码示例和/或参考中缺少什么?


所以,我采用了示例代码,根据我的需要对其进行了修改——读取一个包含六列和许多行的表,该表导出为 csv 文件;在我的本地机器上工作正常(像往常一样,我们都知道)——并将可执行文件复制到安装了 .NET 3.5.x 的 Windows 2008 Server R2 并尝试启动应用程序。您是否已经进行了有根据的猜测?

我再次收到与第一次相同的异常,但这次看起来像那样

            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)

【问题讨论】:

    标签: c# visual-studio oledb foxpro dbf


    【解决方案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
                }
            }
        }
    }
    

    【讨论】:

    • 哇!完美的!正是我需要的,我一直在寻找高低。我有连接字符串,我有查询,我只是不知道如何从这些 FoxPro 数据库中提取数据。谢谢! +1
    【解决方案2】:

    “功能不可用”异常是由于连接字符串不正确造成的。使用“数据源”而不是“数据源”。

    【讨论】:

    • 你是对的。我错过了Data Source 中的空白,这导致了异常。
    【解决方案3】:

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

    看看这是否崩溃......如果是这样,你知道它与创建、插入、选择的任何其他准备无关,而是明确的连接。

    【讨论】:

    • 抱歉 - 我不清楚您所说的“VFP 不支持 64 位 -- PERIOD”是什么意思 IDE 和使用它生成的应用程序都运行良好并且支持 64 位视窗。还是你的意思是别的?
    • @AlanB,它可能会被向后支持 64 位调用/运行 32 位,但 VFP 将无法利用 64 位.. 即:最大数字值,32 位,每个表的记录仍然限制为每个文件 2-gig,等等。
    • 是的,确实如此,但目前在 64 位 Windows 上运行且没有本机 64 位可执行文件的大部分内容也是如此。 2GB 的限制早在 64 位之前就已经存在,并且是使用的遗留文件锁定机制的一个功能。 32 位数字,是的,任何开发产品经常出现这个问题吗?底线:它与 64 位 Windows 上的任何其他 32 位应用程序一样受支持(直到 2014 年)。
    • @DRapp 嗯,它是 64 位系统,但在这种情况下,只要项目首选项设置为 32 位兼容模式并正确安装驱动程序,示例就可以正常编译。
    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多