Исключение 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();
}
}
}
Ответы
Ответ 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 на вашем компьютере.
- Перекомпилируйте и запустите проект
- Ошибка времени выполнения должна быть разрешена