Поставщик VFPOLEDB не зарегистрирован на локальном компьютере. Исключения сохраняются. - PullRequest
0 голосов
/ 18 сентября 2018

Пожалуйста, прочитайте примечание ниже:

Я пытаюсь подключиться к базе данных Fox Pro, и это очень расстраивает.

Следуя некоторым ответам в StackOverflow, я сделал следующее:

  • Установил vfpoledb из Microsoft
  • Я сел на платформув x86 в свойствах проекта.
  • Запуск Visual Studio / приложения в режиме администратора
  • Файл базы данных разблокирован.

По-прежнему выдается исключение, что поставщикне зарегистрирован на этом компьютере.

Я использую 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) приложение по-прежнему выдает исключение во время сеанса отладки, но не при запуске приложения из проводника.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Можете ли вы протестировать этот код (при условии, что вы создали или создали 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
0 голосов
/ 26 сентября 2018

Из другого ответа на VFP и OleDb

Несколько вещей ... Поставщик "VFPOLEDB.1" Во-вторых, строка подключения должна указывать на PATH, а не на конкретныйТаблица.Наконец, когда у вас есть соединение 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...
0 голосов
/ 23 сентября 2018

Это действительно очень просто, у вас есть дополнительные кавычки в строке подключения, которые вызывают проблему:

 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
        }
...