2015-06-22 3 views
12

Я разрабатываю небольшое приложение, которое упростит ведение журнала, и делает это, добавляя некоторые входы в базу данных MS Access через OleDB.SEHException on OleDb connection open

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 работает так, как ожидалось. Однако, когда я использую этот API из проекта C# WPF, он выкинет 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

Вы пытались заменить его эквивалентным кодом C# в вашем WPF p roject и увидеть, если ошибка все еще происходит? – 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 Engine, который установлен на вашем компьютере.

Чтобы устранить эту ошибку:

  • Изменение конфигурации платформы сборки в Visual Studio - убедитесь, что он соответствует Microsoft Access версии Database Engine на вашей машине
  • Recompile и запустить свой проект
  • Ошибка времени выполнения должна быть разрешена