【发布时间】: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 位目标。更改平台目标使其工作!