【问题标题】:SEHException on OleDb connection openOleDb 连接打开时的 SEHException
【发布时间】:2015-09-07 15:50:34
【问题描述】:

我正在开发一个可以简化日志记录的小型应用程序,它通过 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();
            }
        }
    }

【问题讨论】:

  • 您是否尝试将其替换为 WPF 项目中的等效 C# 代码并查看错误是否仍然存在?
  • 异常说明了什么?
  • @FyodorSoikin External Component has thrown an Exception.
  • @OverlyExcessive 似乎在 fsi 和 WPF 应用程序中的 WPF 进程 (1) 之间有所不同是在 STAThread 上运行的查询吗? (2) 一个在 32 位模式下运行,另一个在 64 位模式下运行?
  • @PhillipTrelford 看来你一针见血了! FSI 默认设置为 64 位运行,看来我的 WPF 项目设置为 32 位目标。更改平台目标使其工作!

标签: c# ms-access f# oledb


【解决方案1】:

在 Philip 的帮助下,我得以解决。似乎默认情况下,FSI 配置为在默认情况下以 64 位运行,而 WPF 项目设置为“首选 32 位”。将 WPF 项目的目标平台更改为 64 位解决了该问题。

【讨论】:

    【解决方案2】:

    尝试运行以下代码时:

    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 throw an Exception'

    这通常会在 Visual Studio 中的构建配置平台不正确时发生,这可能发生在构建配置平台 x86 和 x64 中。

    这是由于您的项目的构建配置平台与安装在您计算机上的 Microsoft Access 数据库引擎不匹配。

    为了解决这个错误:

    • 在 Visual Studio 中更改构建配置平台 - 确保它与您计算机上的 Microsoft Access 数据库引擎版本匹配
    • 重新编译并运行您的项目
    • 现在应该解决运行时错误

    【讨论】:

      【解决方案3】:

      我知道这是一个真的旧线程,但我只是遇到了同样的问题,但使用了不同的解决方案。

      当我为 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 数据库引擎即可解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 2013-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多