我正在开发一个简化日志记录的小应用程序,它是通过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();
}
}
}
答案 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数据库引擎 不匹配所致。
要解决此错误:
答案 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 数据库引擎解决了问题。