SQL-запрос хорошо выполняется SQL Server, но возвращает время ожидания при выполнении ADO.NET - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть сервер, который выполняет SQL-запросы к Azure SQL Server с использованием ADO.NET

Когда я пытаюсь выполнить определенный запрос на своем сервере (с помощью ADO.NET), я получаю сообщение об ошибке тайм-аута,но когда я выполняю тот же запрос SQL Server, я получаю результаты через 1-2 секунды.

Я попытался увеличить время ожидания в строке подключения и в объекте SqlCommand без результатов.

Я нашел одно потенциальное решение для изменения времени ожидания в объекте SqlCommand на 0, я пытался и получал результаты через долгое время, но он работает только на моей локальной машине, а не на моем рабочем сервере

Это код, который я использую на своем сервере для интеграции моей БД:

using (var connection = new SqlConnection(ConnectionString))
{   
    var command = new SqlCommand
    {
        CommandText = query
    };

    foreach ( var parameter in parameters)
        command.Parameters.AddWithValue(parameter.Key, parameter.Value ?? Convert.DBNull);

    command.Connection = connection;

    try
    {
        _logger.Info("Open connection to db");
        connection.Open();

        _logger.Info("Execute command");
        SqlDataReader reader = command.ExecuteReader();

        List<Column> columns = CreateColumnList(reader);
    }
    catch (Exception e)
    {
        _logger.Error(e);
    }
}

Это сообщение об исключении, которое я получаю:

Время ожидания довыполнение истекло.Период ожидания истек до завершения действия или сервер не отвечает

1 Ответ

2 голосов
/ 28 апреля 2019

Вместо AddWithValue укажите фактический тип базы данных столбца и максимальную длину.Например:

command.Parameters.Add(parameter.Key, SqlDbType.VarChar, 30).Value = parameter.Value ?? Convert.DBNull);

Эта практика обеспечит совпадение типа и длины параметра с базовым столбцом и облегчит эффективное использование индекса в запросе. Большая проблема с AddWithValue заключается в том, что он выведет тип данных nvarchar со строками, что предотвратит выражение SARGable для столбца varchar с сопоставлением SQL.

Причина, по которойЗапрос SSMS выполняется быстро, скорее всего, потому что специальный запрос указывает литерал или переменную varchar.

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