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 数据库引擎解决了问题。