OleDb 连接打开时出现 SEHException
SEHException on OleDb connection open
我正在开发一个可以简化日志记录的小型应用程序,它通过 OleDB 将一些输入添加到 MS Access 数据库来实现。
let private conn = new OleDbConnection(connectionString)
let private submitCmd date wins =
let cmd = new OleDbCommand("INSERT INTO ArenaStats ([Date], [Wins]) VALUES (@Date, @Wins)",
Connection = conn, CommandType = CommandType.Text)
["@Date", box date; "@Wins", box wins]
|> List.iter (cmd.Parameters.AddWithValue >> ignore)
cmd
let private submit date wins =
try
conn.Open()
(submitCmd date wins).ExecuteNonQuery() |> ignore
finally
conn.Close()
[<CompiledName "AddEntry">]
let addEntry(date:DateTime, wins:int) =
submit date wins
现在通过 FSI 进行测试,效果如预期。但是,当我从 C# WPF 项目使用此 API 时,它会在 conn.Open()
处抛出一个 SEHException
。我真的很想知道为什么会这样。
编辑
按照建议,我也尝试过在同一个项目中纯用C#实现相同的代码,它会在同一个地方抛出相同的异常,但我发布下面的代码以供参考。
class MsAccessDatabase : IArenaWinsDatabase {
private OleDbConnection connection = new OleDbConnection(connectionString);
private OleDbCommand SubmitCommand(DateTime date, int wins) {
return new OleDbCommand("INSERT INTO ArenaStats ([Date], [Wins]) VALUES (@Date, @Wins)") {
Connection = connection,
CommandType = System.Data.CommandType.Text,
Parameters = {
new OleDbParameter("@Date", date),
new OleDbParameter("@Wins", wins)
}
};
}
public void Submit(DateTime date, int wins) {
try {
connection.Open();
SubmitCommand(date, wins).ExecuteNonQuery();
}
finally {
connection.Close();
}
}
}
在 Philip 的帮助下,我终于弄明白了。似乎默认情况下 FSI 在 64 位中默认配置为 运行,而 WPF 项目设置为 "prefer 32-bit"。将 WPF 项目的目标平台更改为 64 位解决了该问题。
尝试运行以下代码时:
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;", FilePath);
OleDbConnection OleDbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
OleDbConnection.Open();
SEHException异常在运行时间抛出,错误信息'External Component has thrown an Exception'
这通常会在 Visual Studio 中的构建配置平台不正确时发生,这在构建配置平台 x86 和 x64 中都可能发生。
这是由于您项目的构建配置平台与安装在您的计算机上的 Microsoft Access 数据库引擎不匹配所致机器。
为了解决这个错误:
- 更改 Visual Studio 中的构建配置平台 - 确保它与您计算机上的 Microsoft Access 数据库引擎版本相匹配
- 重新编译并运行您的项目
- 运行 时间错误现在应该已解决
我知道这是一个 真的 旧线程,但我只是 运行 用不同的解决方案解决了同样的问题.
当我为 ACE 提供程序安装 Access Database Engine 2016 Redistributable (x64) 时,安装程序给我一个错误,指出 VCRUNTIME140.DLL 没有安装,但安装程序无论如何都完成了并且 ACE 提供程序可用。
卸载 Access 数据库引擎,安装 VC++ 2015 Redistributable R3 (https://www.microsoft.com/en-us/download/confirmation.aspx?id=52685),然后重新安装 Access 数据库引擎解决了问题。
我正在开发一个可以简化日志记录的小型应用程序,它通过 OleDB 将一些输入添加到 MS Access 数据库来实现。
let private conn = new OleDbConnection(connectionString)
let private submitCmd date wins =
let cmd = new OleDbCommand("INSERT INTO ArenaStats ([Date], [Wins]) VALUES (@Date, @Wins)",
Connection = conn, CommandType = CommandType.Text)
["@Date", box date; "@Wins", box wins]
|> List.iter (cmd.Parameters.AddWithValue >> ignore)
cmd
let private submit date wins =
try
conn.Open()
(submitCmd date wins).ExecuteNonQuery() |> ignore
finally
conn.Close()
[<CompiledName "AddEntry">]
let addEntry(date:DateTime, wins:int) =
submit date wins
现在通过 FSI 进行测试,效果如预期。但是,当我从 C# WPF 项目使用此 API 时,它会在 conn.Open()
处抛出一个 SEHException
。我真的很想知道为什么会这样。
编辑
按照建议,我也尝试过在同一个项目中纯用C#实现相同的代码,它会在同一个地方抛出相同的异常,但我发布下面的代码以供参考。
class MsAccessDatabase : IArenaWinsDatabase {
private OleDbConnection connection = new OleDbConnection(connectionString);
private OleDbCommand SubmitCommand(DateTime date, int wins) {
return new OleDbCommand("INSERT INTO ArenaStats ([Date], [Wins]) VALUES (@Date, @Wins)") {
Connection = connection,
CommandType = System.Data.CommandType.Text,
Parameters = {
new OleDbParameter("@Date", date),
new OleDbParameter("@Wins", wins)
}
};
}
public void Submit(DateTime date, int wins) {
try {
connection.Open();
SubmitCommand(date, wins).ExecuteNonQuery();
}
finally {
connection.Close();
}
}
}
在 Philip 的帮助下,我终于弄明白了。似乎默认情况下 FSI 在 64 位中默认配置为 运行,而 WPF 项目设置为 "prefer 32-bit"。将 WPF 项目的目标平台更改为 64 位解决了该问题。
尝试运行以下代码时:
var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;", FilePath);
OleDbConnection OleDbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
OleDbConnection.Open();
SEHException异常在运行时间抛出,错误信息'External Component has thrown an Exception'
这通常会在 Visual Studio 中的构建配置平台不正确时发生,这在构建配置平台 x86 和 x64 中都可能发生。
这是由于您项目的构建配置平台与安装在您的计算机上的 Microsoft Access 数据库引擎不匹配所致机器。
为了解决这个错误:
- 更改 Visual Studio 中的构建配置平台 - 确保它与您计算机上的 Microsoft Access 数据库引擎版本相匹配
- 重新编译并运行您的项目
- 运行 时间错误现在应该已解决
我知道这是一个 真的 旧线程,但我只是 运行 用不同的解决方案解决了同样的问题.
当我为 ACE 提供程序安装 Access Database Engine 2016 Redistributable (x64) 时,安装程序给我一个错误,指出 VCRUNTIME140.DLL 没有安装,但安装程序无论如何都完成了并且 ACE 提供程序可用。
卸载 Access 数据库引擎,安装 VC++ 2015 Redistributable R3 (https://www.microsoft.com/en-us/download/confirmation.aspx?id=52685),然后重新安装 Access 数据库引擎解决了问题。