System.Runtime.InteropServices.SEHException: «Внешний компонент вызвал исключение». когда я использую OleDbDataAdapter

введите здесь описание изображенияЭто мой код. И я использую VS2017, AccessDatabaseEngine 32 бит.

[HttpPost]
public JsonResult GetConditionOfDisease(string inputString)
{
    var adapter = new OleDbDataAdapter("select * from [history$]", connectionString);
    var ds = new DataSet();
    adapter.Fill(ds, "CompetitorAsset");
    System.Data.DataTable data = ds.Tables["CompetitorAsset"];
    List<string> conditionOfDisease = data.AsEnumerable().Select(r => r.Field<string>("F5")).ToList();
    conditionOfDisease.RemoveAt(0);
    var distinctConditionOfDisease = conditionOfDisease.Distinct().ToList();
    var matchConditionOfDisease = distinctConditionOfDisease.Where(s => s != null && s.Trim().ToLower().Contains(inputString.Trim().ToLower())).ToList();
    return Json(matchConditionOfDisease);
}

person Kishan    schedule 11.02.2020    source источник
comment
Какая строка кода вызвала исключение?   -  person mjwills    schedule 11.02.2020
comment
adapter.Fill(ds, CompetitorAsset);/// здесь получаем исключение   -  person Kishan    schedule 11.02.2020
comment
Возможно, это связано с ядром базы данных Microsoft Access. Для получения дополнительной информации вы можете обратиться к OleDbConnection получает "Внешний компонент вызвал исключение.”.   -  person Jack J Jun - MSFT    schedule 12.02.2020
comment
Не полезно....   -  person Kishan    schedule 13.02.2020


Ответы (2)


Я вижу в документации. Класс OleDbDataAdapter не перегружает метод Fill, как насчет вас.

У него есть два метода заполнения перегрузки:

public int Fill(DataTable dataTable, object ADODBRecordSet);
public int Fill(DataSet dataSet, object ADODBRecordSet, string srcTable);

Ваше использование:

adapter.Fill(ds, "CompetitorAsset"); 

Используйте перегрузки, которые я вам указал. Обратите внимание на DataTable DataSet, не путайте, удачи!

person philomelka    schedule 11.02.2020

введите здесь описание изображенияПопробуйте переписать так, чтобы

[HttpPost]
    public JsonResult GetConditionOfDisease(string inputString)
    {
        var ds = new DataSet();
        using (var adapter = new OleDbDataAdapter("select * from [history$]", connectionString))
        {               
            adapter.Fill(ds, "CompetitorAsset");
        }
        System.Data.DataTable data = ds.Tables["CompetitorAsset"];
        List<string> conditionOfDisease = data.AsEnumerable().Select(r => r.Field<string>("F5")).ToList();
        conditionOfDisease.RemoveAt(0);
        var distinctConditionOfDisease = conditionOfDisease.Distinct().ToList();
        var matchConditionOfDisease = distinctConditionOfDisease.Where(s => s != null && s.Trim().ToLower().Contains(inputString.Trim().ToLower())).ToList();
        return Json(matchConditionOfDisease);
    }

Использовать использование с использованием интерфейса IDisposable объектов

person philomelka    schedule 11.02.2020
comment
попробовал, но не работает. Пожалуйста, смотрите изображение для справки - person Kishan; 11.02.2020
comment
Трассировка стека, пожалуйста - person philomelka; 11.02.2020
comment
Пожалуйста, найдите изображение для трассировки стека - person Kishan; 11.02.2020
comment
да, будем использовать его, на самом деле это для пилотного проекта для демонстрационных целей, как только клиент будет в порядке, мы реализуем все эти вещи (попробуйте поймать, зарегистрировать, безопасность и т. д...) - person Kishan; 13.02.2020