Подтвердить что ты не робот

Исключение SEHException при подключении OleDb

Я разрабатываю небольшое приложение, которое упростит ведение журнала, и делает это, добавляя некоторые входы в базу данных MS Access через 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

Теперь тестирование этого через FSI работает так же, как ожидалось. Однако, когда я использую этот API из проекта С# WPF, он будет бросать SEHException at conn.Open(). Я действительно почесываю голову, почему это происходит.

Edit

Как я уже сказал, я также пытался реализовать тот же код только на С# и в том же проекте, он будет генерировать одно и то же исключение в одном и том же месте, но я отправляю код ниже для справки.

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();
            }
        }
    }
4b9b3361

Ответ 1

С некоторой помощью Филиппа я смог понять это. По-видимому, по умолчанию FSI настроен на запуск по 64-битной по умолчанию, тогда как проект WPF установлен на "предпочтительный 32-разрядный". Изменение целевой платформы для проекта WPF до 64-разрядного разрешало проблему.

Ответ 2

При попытке запустить следующий код:

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 Database Engine, установленной на вашем компьютере.

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

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