'VFPOLEDB' 提供程序未在本地计算机上注册异常仍然存在

The 'VFPOLEDB' provider is not registered on the local machine exceptions persists

请阅读以下备注:

我正在尝试连接到 fox pro 数据库,这非常令人沮丧。

根据 Whosebug 中的一些答案,我执行了以下操作:

仍然抛出提供者未在本机注册的异常

我是 运行 Windows 10 Pro X64 和 Visual Studio Community 2017。

 public class FoxProHandler
    {
        static OleDbConnection connector = default(OleDbConnection);
        static bool isConnected = false;
        public static string ConnectionString { get; private set; }
        private FoxProHandler()
        {

        }

        public static void SetConnectionString(string Value)
        {
            ConnectionString = Value;
        }
        public Dictionary<string, string> GetValues(string PartNumberValue, Dictionary<string, string> Mapper)
        {
            throw new Exception();
        }
        public static void Connect()
        {
            if (string.IsNullOrWhiteSpace(ConnectionString))
            {
                throw new Exception("Connection string is empty");
            }
            if (isConnected == false)
            {
                try
                {
                    Console.WriteLine($"CREATING DB CONNECTOR");
                    connector = new OleDbConnection(ConnectionString);
                    Console.WriteLine($"CREATING DB CONNECTOR OBJECT");                 
                    connector.Open();
                    Console.WriteLine($"OPENED CONNECTED SUCCESSFULLY");
                    isConnected = true;
                }
                catch (Exception e)
                {

                    Console.WriteLine($"{e.Message} {e.StackTrace}"); 
                }

            }

        }
    }
    class Program
    {

        static void Main(string[] args)
        {
           string fileName = System.IO.Path.Combine(@"C:\Users\Amen\Downloads", "ADMQH20X.DBC"); 
           string connectionString = $"Provider=\"VFPOLEDB\";Data Source=\"{fileName}\";Collate=Machine;"; 
           FoxProHandler.SetConnectionString(connectionString);
           FoxProHandler.Connect();
           Console.ReadKey(); 

        }
    }

如有任何帮助,我们将不胜感激。

备注: 在获取必要的文件 (.dbf) 之后,应用程序在调试会话期间仍会抛出异常,但当 运行 来自资源管理器的应用程序时不会。

确实很简单,您在连接字符串中有多余的引号导致了问题:

 static void Main(string[] args)
        {
           string fileName = System.IO.Path.Combine(@"C:\Users\Amen\Downloads", "ADMQH20X.DBC"); 
           string connectionString = $"Provider=VFPOLEDB;Data Source={fileName}";
           DataTable tbl = new DataTable(); 
           using(OleDbConnection con = new OleDbConnection(connectionString))
           using(OleDbCommand cmd = new OleDbCommand("select * from myTable", con))
           {
              con.Open();
              tbl.Load(cmd.ExecuteReader());
           }

           // do Something with datatable
        }

你能测试一下这段代码吗(前提是你已经创建了 c:\temp):

void Main()
{
    if (IntPtr.Size == 8)
    {
        Console.WriteLine("Sorry this is not going to work in 64 bits");
    }
    else
    {
        DataTable tbl=new DataTable();
        using (OleDbConnection con = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\Temp"))
        {
            con.Open();
            new OleDbCommand("create table myTest (id int, dummy c(10))",con).ExecuteNonQuery();
            var cmd = new OleDbCommand(@"insert into myTest (id, dummy) values (?,?)",con);
            cmd.Parameters.Add("id", OleDbType.Integer);
            cmd.Parameters.Add("dum", OleDbType.VarChar,10);

            for (int i = 0; i < 10; i++)
            {
                cmd.Parameters["id"].Value = i + 1;
                cmd.Parameters["dum"].Value = $"Dummy#{i+1}";
                cmd.ExecuteNonQuery();
            }

            tbl.Load(new OleDbCommand("select * from myTest",con).ExecuteReader());
        }
        foreach (DataRow row in tbl.Rows)
        {
            Console.WriteLine($"{(int)row["id"]} : {(string)row["Dummy"]}");
        }
    }
    Console.ReadLine();
}

或者如果您在记事本中编辑并使用 csc 编译:

using System;
using System.Data;
using System.Data.OleDb;
namespace Test
{
  class Test
  {

static void Main()
{
    if (IntPtr.Size == 8)
    {
        Console.WriteLine("Sorry this is not going to work in 64 bits");
    }
    else
    {
        DataTable tbl=new DataTable();
        using (OleDbConnection con = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\Temp"))
        {
            con.Open();
            new OleDbCommand("create table myTest (id int, dummy c(10))",con).ExecuteNonQuery();
            var cmd = new OleDbCommand(@"insert into myTest (id, dummy) values (?,?)",con);
            cmd.Parameters.Add("id", OleDbType.Integer);
            cmd.Parameters.Add("dum", OleDbType.VarChar,10);

            for (int i = 0; i < 10; i++)
            {
                cmd.Parameters["id"].Value = i + 1;
                cmd.Parameters["dum"].Value = $"Dummy#{i+1}";
                cmd.ExecuteNonQuery();
            }

            tbl.Load(new OleDbCommand("select * from myTest",con).ExecuteReader());
        }
        foreach (DataRow row in tbl.Rows)
        {
            Console.WriteLine($"{(int)row["id"]} : {(string)row["Dummy"]}");
        }
    }
    Console.ReadLine();
}

}
}

保存,说 VFPOLEDBTest.cs 并编译:

csc VFPOLEDBTest.cs /platform:x86

和运行:

VFPOLEDBTest.exe

输出:

d:\Academy>VFPOLEDBTest.exe
1 : Dummy#1
2 : Dummy#2
3 : Dummy#3
4 : Dummy#4
5 : Dummy#5
6 : Dummy#6
7 : Dummy#7
8 : Dummy#8
9 : Dummy#9
10 : Dummy#10

From another answer on VFP and OleDb

一些事情...提供商是 "VFPOLEDB.1" 其次,连接字符串应该指向一个 PATH,而不是特定的 table。 最后,一旦你有了 PATH 连接,你就可以从任何 SUB-PATH/FOLDER 在那里面。

var connectionString = @"Provider=VFPOLEDB.1;Data Source=c:\YourDataPath\SomeSubFolder;";

那么您的查询可以像

一样简单
select YT.* from YourTable YT where...

如果您有子文件夹,您可以...

select YT.* 
    from 
       YourTable YT
         JOIN AnotherSubFolder\SomeOtherTable SOT
            on YT.SomeKey = SOT.SomeKey
    where...

您尝试使用:build as x86,cmd 运行 命令 regsvr32 "C:\Program Files (x86)\Common Files\System\Ole DB\vfpoledb.dll"(已安装 vpf driver)