2015-06-22 17 views
12

Sto sviluppando una piccola applicazione che semplifica la registrazione, lo fa aggiungendo alcuni input a un database MS Access tramite OleDB.SEHException su connessione OleDb aperta

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 

Ora testare questo tramite FSI funziona esattamente come previsto. Tuttavia, quando utilizzo questa API da un progetto C# WPF, verrà generato un valore SEHException allo conn.Open(). Sto davvero grattando la testa sul perché questo sta accadendo.

Modifica

Come suggerito, ho anche cercato di attuare lo stesso codice puramente in C# e nello stesso progetto, si getterà la stessa eccezione nello stesso luogo, ma Vi metto il codice qui sotto per riferimento.

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

Hai provato a sostituirlo con il codice C# equivalente all'interno del tuo WPF p roject e vedere se l'errore si verifica ancora? – AlexFoxGill

+0

Cosa dice l'eccezione? –

+0

@FyodorSoikin '' Componente esterno ha generato un'eccezione'' –

risposta

9

Con l'aiuto di Philip, sono riuscito a capirlo. Sembra che FSI di default sia configurato per funzionare a 64-bit di default mentre il progetto WPF è impostato su "preferisci 32-bit". La modifica della piattaforma di destinazione per il progetto WPF a 64 bit ha risolto il problema.

1

Quando si tenta di eseguire il codice seguente:

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(); 

Un'eccezione SEHException viene lanciata in fase di esecuzione, con il messaggio di errore 'componente esterno ha generato un'eccezione'

Questo solitamente volontà si verificano quando la piattaforma di configurazione di build in Visual Studio non è corretta, ciò può verificarsi in entrambe le piattaforme di configurazione build, x86 e x64.

Ciò è dovuto ad una mancata corrispondenza tra la piattaforma configurazione di generazione del progetto e il database di Microsoft Access Engine che viene installato sul computer.

Al fine di risolvere questo errore:

  • Modificare la piattaforma di configurazione di generazione in Visual Studio - accertarsi che corrisponda alla versione del motore di database Microsoft Access sulla vostra macchina
  • Ricompilate ed eseguire il progetto
  • L'errore di runtime dovrebbe essere risolto
Problemi correlati