2015-06-22 37 views
12

Zajmuję się tworzeniem małej aplikacji, która uprości rejestrowanie, czyni to poprzez dodanie niektórych danych wejściowych do bazy danych MS Access za pośrednictwem OleDB.Wyjątek SEHException na otwartym porcie 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 

Teraz testowanie tego przez FSI działa zgodnie z oczekiwaniami. Jednak, gdy skonsumuję ten API z projektu C# WPF, wygeneruje on SEHException pod adresem conn.Open(). Naprawdę drapię się po głowie, dlaczego tak się dzieje.

Edit

Jak sugeruje, mam również starał się realizować ten sam kod wyłącznie w języku C# i w tym samym projekcie, będzie rzucać ten sam wyjątek w tym samym miejscu, ale jestem delegowania kod poniżej odniesienie.

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

Czy próbowałeś zastąpić go równoważnym kodem C# w ramach WPF p roject i zobacz, czy błąd nadal występuje? – AlexFoxGill

+0

Co mówi ten wyjątek? –

+0

@FyodorSoikin '' Komponent zewnętrzny ma wyjątek. ' –

Odpowiedz

9

Z pomocą Filipa udało mi się go rozgryźć. Wygląda na to, że domyślnie FSI jest skonfigurowany domyślnie na 64-bitowe, podczas gdy projekt WPF jest ustawiony na "preferuje 32-bitowy". Zmiana docelowej platformy dla projektu WPF na 64-bitowe rozwiązało problem.

1

Gdy próbuje uruchomić następujący kod:

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

Wyjątek SEHException jest wyrzucane w czasie wykonywania, z komunikatem o błędzie „Element zewnętrzny został rzucony wyjątek”

będzie to zazwyczaj występuje, gdy platforma konfiguracji kompilacji w programie Visual Studio jest niepoprawna, może wystąpić w obu platformach konfiguracji budowania, x86 i x64.

Wynika to z niedopasowania pomiędzy platformą konfiguracji kompilacji projektu i bazy danych Microsoft Access Engine który jest zainstalowany na komputerze.

Aby rozwiązać ten błąd:

  • Zmienić platformy konfiguracja kompilacji w Visual Studio - upewnij się, że pasuje do wersji aparatu bazy danych Microsoft Access na komputerze
  • Rekompilacja i uruchomić projekt
  • Błąd czasu wykonywania powinien zostać teraz rozwiązany