System.Runtime.InteropServices.SEHException - в соединении OleDb, используя C# - PullRequest
1 голос
/ 21 апреля 2020

Мы подключаемся к Access DB через OLE DB Connection, и она работала до последнего обновления офиса. Теперь после получения последней версии MS Office

System.Runtime.InteropServices.SEHException: 'External component has thrown an exception.'

Моя конфигурация сборки - x86, а ядро ​​базы данных Access также 32-разрядное. Итак, в качестве решения я восстановил механизм доступа, и он начинает работать. Но я могу воспроизвести проблему с кодом ниже

static void Main(string[] args)
        {

            var _conStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.accdb; Persist Security Info=False";

            try
            {


                Task.Run(() =>
                {
                    using (var con = new OleDbConnection(_conStr))
                    {
//This Call 1
                        con.Open();
                    }
                });


                using (OleDbConnection OleDbConnection = new System.Data.OleDb.OleDbConnection(_conStr))
                {


// This Call 2
                    OleDbConnection.Open();
                }


                Console.WriteLine("Hello World 1!");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.WriteLine("Hello World 2!");
            Console.ReadKey();
        }
    }

В вызове 2 только я получаю это исключение. Но самое запутанное, как это проблема с последним обновлением. Как получится, если я исправлю ядро ​​базы данных доступа.

Что такое исправление для приведенного выше кода? Я использовал много задач в своем приложении.

Заранее спасибо

1 Ответ

1 голос
/ 23 апреля 2020

Поскольку это вызывает проблему только в многопоточности. Таким образом, мы рассмотрели проблему в потоке безопасных вызовов. Пожалуйста, обратитесь ниже.

class Program
{
    static object synObj = new object();

    static string _conStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.accdb;Jet OLEDB:Database Password=1234567;";

    static OleDbConnection _oleDBObject;
    public static OleDbConnection OleDBObject
    {
        get
        {
            lock (synObj)
            {
                if (_oleDBObject != null && _oleDBObject.State == System.Data.ConnectionState.Open)
                {

                    return _oleDBObject;

                }
                else
                {
                    _oleDBObject = new OleDbConnection(_conStr);
                    _oleDBObject.Open();
                    return _oleDBObject;
                }
            }
        }
    }


    static void Main(string[] args)
    { 
        try
        {

            int i = 0;

            while (i < 10)
            {
                Task.Run(() =>
                {

                    // Connection inside task
                    var con = OleDBObject;
                    Console.WriteLine("Inside Task -" + i.ToString());

                });   

                i++;

                Console.WriteLine("Task -" + i.ToString());

            }

            // Connection outside task
            OleDbConnection OleDbConnection = OleDBObject;


            Console.WriteLine("Hello World 1!");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.ReadKey();
    }


}
...