Estoy desarrollando una pequeña aplicación que simplificará el registro, lo hace agregando algunas entradas a una base de datos de MS Access a través de OleDB.
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 Ahora probar esto a través de FSI funciona tal como se esperaba. Sin embargo, cuando consumo esta API de un proyecto WPF de C#, generará una SEHException en conn.Open() . Realmente me estoy rascando la cabeza sobre por qué sucede esto.
Editar
Como se sugirió, también intenté implementar el mismo código puramente en C# y en el mismo proyecto, arrojará la misma excepción en el mismo lugar, pero estoy publicando el código a continuación como referencia.
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(); } } }Con un poco de ayuda de Philip pude resolverlo. Parece que, de forma predeterminada, FSI está configurado para ejecutarse en 64 bits de forma predeterminada, mientras que el proyecto WPF está configurado para "preferir 32 bits". Cambiar la plataforma de destino para el proyecto WPF a 64 bits resolvió el problema.
Al intentar ejecutar el siguiente código:
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();Se lanza una excepción SEHException en tiempo de ejecución , con el mensaje de error 'El componente externo ha lanzado una excepción'
Esto suele ocurrir cuando la plataforma de configuración de compilación en Visual Studio es incorrecta, esto puede ocurrir en ambas plataformas de configuración de compilación, x86 y x64.
Esto se debe a una discrepancia entre la plataforma de configuración de compilación de su proyecto y el motor de base de datos de Microsoft Access que está instalado en su máquina.
Para resolver este error:
Sé que este es un hilo muy antiguo, pero me encontré con el mismo problema con una solución diferente.
Cuando instalé Access Database Engine 2016 Redistributable (x64) para el proveedor ACE, el instalador me dio un error de que VCRUNTIME140.DLL no estaba instalado, pero el instalador se completó de todos modos y el proveedor ACE estaba disponible.
Desinstalar Access Database Engine, instalar VC++ 2015 Redistributable R3 ( https://www.microsoft.com/en-us/download/confirmation.aspx?id=52685 ) y luego volver a instalar Access Database Engine resolvió el problema.