Комментарии в исходном примере показывают, что вы на самом деле должны делать.
вам нужно создать модель для хранения необходимой информации.
Что-то вроде
/// <summary>
/// Represents the result of an ADO.Net operation.
/// </summary>
public class AdoNetResult {
private List<Exception> _errors = new List<Exception>();
public bool Succeeded { get; protected set; }
public IEnumerable<Exception> Errors => _errors;
public static AdoNetResult Success { get; } = new AdoNetResult { Succeeded = true };
public static AdoNetResult Failed(params Exception[] errors) {
var result = new AdoNetResult { Succeeded = false };
if (errors != null) {
result._errors.AddRange(errors);
}
return result;
}
}
Интерфейс, однако, должен быть реорганизован
public interface IAdoNetRepository {
Task<AdoNetResult> FillAlarmsDataTable();
}
и реализация
public async Task<AdoNetResult> FillAlarmsDataTable() {
string connectionString = _config.GetConnectionString("Data:DefaultConnection:ConnectionString");
try {
SqlConnection connection = new SqlConnection(connectionString);
string cmdText1 = "SELECT * FROM [dbo].[Alarms] ORDER BY Name";
// Create a new data adapter based on the specified query.
dataAdapter = new SqlDataAdapter(cmdText1, connection);
// Populate a new data table and bind it to the BindingSource.
alarmDataTable = new DataTable {
Locale = CultureInfo.InvariantCulture
};
await Task.Run(() => dataAdapter.Fill(alarmDataTable));
// Return what ?
return AdoNetResult.Success;
} catch (Exception ex) {
// Return the task with details of the exception
return AdoNetResult.Failed(ex);
}
}
После этого исходный код должен работать как задумано
public async Task<IActionResult> OnPostUpdateAlarmDataTableAsync() {
var result = await _adoNetRepository.FillAlarmsDataTable();
if (!result.Succeeded) {
// log the exception returned from the task that failed!
//result.Errors
}
return new JsonResult(result);
}
В качестве альтернативы можно было бы разрешить FillAlarmsDataTable
генерировать любые исключения, с которыми он может столкнуться
public Task FillAlarmsDataTable() {
string connectionString = _config.GetConnectionString("Data:DefaultConnection:ConnectionString");
SqlConnection connection = new SqlConnection(connectionString);
string cmdText1 = "SELECT * FROM [dbo].[Alarms] ORDER BY Name";
// Create a new data adapter based on the specified query.
dataAdapter = new SqlDataAdapter(cmdText1, connection);
// Populate a new data table and bind it to the BindingSource.
alarmDataTable = new DataTable {
Locale = CultureInfo.InvariantCulture
};
return Task.Run(() => dataAdapter.Fill(alarmDataTable));
}
перехватывать ( catch ) исключение, где оно используется, и отвечать соответствующим образом
public async Task<IActionResult> OnPostUpdateAlarmDataTableAsync() {
try {
await _adoNetRepository.FillAlarmsDataTable();
return Ok(); //200 OK
catch(Exception ex) {
//...log the exception returned from the task that failed!
return new ExceptionResult(ex, includeErrorDetail:true);
}
}