'VFPOLEDB' 提供程序未在本地计算机上注册异常仍然存在
The 'VFPOLEDB' provider is not registered on the local machine exceptions persists
请阅读以下备注:
我正在尝试连接到 fox pro 数据库,这非常令人沮丧。
根据 Whosebug 中的一些答案,我执行了以下操作:
- 从 Microsoft
安装了 vfpoledb
- 我在项目属性中将平台目标设置为 x86。
- 运行 可视化 Studio/Application 管理员模式
- 数据库文件解锁。
仍然抛出提供者未在本机注册的异常
我是 运行 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)
请阅读以下备注:
我正在尝试连接到 fox pro 数据库,这非常令人沮丧。
根据 Whosebug 中的一些答案,我执行了以下操作:
- 从 Microsoft 安装了 vfpoledb
- 我在项目属性中将平台目标设置为 x86。
- 运行 可视化 Studio/Application 管理员模式
- 数据库文件解锁。
仍然抛出提供者未在本机注册的异常
我是 运行 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)