2015-06-22 82 views
12

我正在开发一个简化日志记录的小应用程序,它通过OleDB为MS Access数据库添加了一些输入。在OleDb连接打开时发生SEHException

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时,它将抛出SEHExceptionconn.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

你有没有尝试用你的WPF中的等效C#代码替换它?项目,看看错误是否仍然存在? – AlexFoxGill

+0

例外情况如何? –

+0

@FyodorSoikin''外部组件抛出一个异常.'' –

回答

9

在菲利普的帮助下,我弄明白了。看起来,默认情况下,FSI被配置为默认运行在64位,而WPF项目设置为“优先32位”。将WPF项目的目标平台更改为64位解决了问题。

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数据库引擎版本相匹配您的机器
  • 重新编译并运行你的项目
  • 现在应该解决运行时错误