SQL не обновляется должным образом - PullRequest
0 голосов
/ 15 ноября 2018

Для нашего проекта у нас есть таблица, где мы получаем все футбольные результаты за один игровой день. В зависимости от значения базы данных SQL отображается вход, в который пользователь может добавить результаты сопоставления. Когда мы нажимаем кнопку «Сохранить», происходит вставка в базу данных. По какой-то причине время от времени не все строки добавляются в базу данных.

[HttpPost("UpdateMatchDayScore")]
public async void UpdateMatchDayScore([FromBody]UpdateMatchDayScoreViewModel[] model)
{
    var matchDayId = model[0].matchDayId;
    var poolId = model[0].poolId;
    RankingSearch rankingSearch =  await _rankingService.CreateNewRanking(matchDayId, poolId);
    foreach (var t in model)
    {
        _matchDayService.UpdateMatchDayScore(rankingSearch.RankingId,t.poolId, t.homeTeamId, t.awayTeamId, Int32.Parse(t.scoreHome),Int32.Parse(t.scoreAway), t.matchDayId);
    }
    _calculateRanking.CalculatePosition(rankingSearch.RankingId);
}

Это наша модель:

public class UpdateMatchDayScoreViewModel
{
    public int poolId  { get; set; }
    public int homeTeamId { get; set; }
    public int awayTeamId { get; set; }
    public string scoreHome { get; set; }
    public string scoreAway { get; set; }
    public int matchDayId { get; set; }
}

Это наш репозиторий игровых дней:

public async void UpdateMatchDayScore(int poolId, int homeTeamId, int awayTeamId,
int scoreHome, int scoreAway,
int matchDayId)
{
    using (var conn = _connector.OpenConnection())
    {
         await conn.QueryAsync<MatchDay>(StoredProcs.UpdateMatchScore,
            new
            {
                pouleId = poolId,
                awayTeamId = awayTeamId,
                homeTeamId= homeTeamId,
                scoreAway = scoreAway,
                scoreHome = scoreHome,
                matchDayId = matchDayId
            }, CommandType.StoredProcedure);
    }
}

Это наш игровой сервис:

public void UpdateMatchDayScore(int rankingId, int poolId, int homeTeamId, int awayTeamId, int scoreHome, int scoreAway, int matchDayId)
{
    _calculateRanking.CalculateRankings(rankingId, matchDayId, awayTeamId, homeTeamId, scoreHome, scoreAway);
    _matchDayRepository.UpdateMatchDayScore(poolId, homeTeamId, awayTeamId, scoreHome, scoreAway,
        matchDayId);
}

Пример модели:

    {
                pouleId = 46273,
                awayTeamId = 400069,
                homeTeamId= 400002,
                scoreAway = 2,
                scoreHome = 4,
                matchDayId = 12}

Мы выполнили некоторые математические расчеты и в общей сложности за один игровой день (который содержит 8 игр) открывается 41 соединение. Мы думаем, что можем сделать много за один раз? Может ли кто-нибудь помочь нам?

1 Ответ

0 голосов
/ 15 ноября 2018

Это не похоже на проблему с количеством соединений, скорее, это способ, которым вы вызываете ваши методы.

Ваш код представляет собой смесь методов Async и Sync. Кроме того, методы Async не вызываются должным образом, используя «await» во всех местах. И это открытое приглашение к неприятностям.

Прочтите этот пост, чтобы понять, с какими проблемами вы можете столкнуться при этом. https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Примечание: В этом посте говорится о взаимоблокировке, но она применима и в вашем случае.

Я предполагаю, что в цикле foreach отсутствует обновление некоторых записей из-за неправильного получения статуса Task в некоторых случаях.

Я бы посоветовал вам, если вы новичок в домене async-await, сначала попробуйте свой код, используя только методы синхронизации, а затем попробуйте применить функцию async.

Если некоторые из методов async -только, вы можете добавить .Wait() метод в конце, чтобы ваш код ожидал завершения Task, прежде чем переходить к следующему оператору выполнения.

https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.wait?view=netframework-4.7.2#System_Threading_Tasks_Task_Wait

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...