关于OleDb连接打开的SEHException

时间:2015-06-22 08:57:46

标签: c# ms-access f# oledb

我正在开发一个简化日志记录的小应用程序,它是通过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时,它会在SEHException处抛出conn.Open()。我真的很想知道为什么会这样。

修改

正如所建议的那样,我也试图在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();
            }
        }
    }

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:1)

尝试运行以下代码时:

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异常,错误消息'外部组件抛出异常'

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

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

要解决此错误:

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

答案 2 :(得分:0)

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

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