System.Runtime.InteropServices.SEHException - 在 OleDb 连接中使用 C#
System.Runtime.InteropServices.SEHException - in OleDb Connection using C#
我们正在通过 OLE DB 连接连接到 Access DB,它一直工作到上次办公室更新。现在获得最新版本的 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 中我遇到了这个异常。但是,最令人困惑的是,最新更新是如何出现问题的。如果我修复访问数据库引擎,它如何工作。
以上代码的修复方法是什么?我在我的应用程序中使用了很多任务。
提前致谢
就其仅在多线程中引起的问题而言。因此,我们已经处理了线程安全调用中的问题。
请参考以下内容。
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();
}
}
我们正在通过 OLE DB 连接连接到 Access DB,它一直工作到上次办公室更新。现在获得最新版本的 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 中我遇到了这个异常。但是,最令人困惑的是,最新更新是如何出现问题的。如果我修复访问数据库引擎,它如何工作。
以上代码的修复方法是什么?我在我的应用程序中使用了很多任务。
提前致谢
就其仅在多线程中引起的问题而言。因此,我们已经处理了线程安全调用中的问题。 请参考以下内容。
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();
}
}