Как установить время ожидания для моего запроса в LinqPad в ExecuteQueryDynamic? - PullRequest
0 голосов
/ 04 марта 2019

Как установить тайм-аут для моего запроса в LinqPad в ExecuteQueryDynamic?

Util.CurrentDataContext.ExecuteQueryDynamic($"SELECT count(*) FROM MyDb.dbo.{viewName}");

Я хотел бы использовать этот тайм-аут для обнаружения слишком медленных просмотров.Для каждого представления я запрашиваю счет, но когда мой счет занимает слишком много времени, я просто останавливаю его и считаю следующий.

Вот мой полный код LINQPad

void Main()
{
    // In case of error "There is already an open DataReader associated with this Command which must be closed first."
    // https://stackoverflow.com/q/6062192/196526
    // Add MultipleActiveResultSets=true to connection string. 

    var biewsCount = b.V_sysobjects.Where(v => v.Type == "V").Count();
    var bViewsDetail = Util.OnDemand<List<SysObject>>("Get Views Detail", () => GetViewsDetail("b", b.V_sysobjects.Where(v => v.Type == "V").Select(v => v.Name).ToList()));
    bViewsDetail.Dump();
}

public List<SysObject> GetViewsDetail(string database, List<string> objectNames)
{
    var result = new List<SysObject>();
    foreach (var name in objectNames)
    {
        Console.Write($"{database}.dbo.{name}");
        // I should add a timeout stuff here or before
        var count = (int)Util.CurrentDataContext.ExecuteQueryDynamic($"SELECT count(*) FROM {database}.dbo.{name}").Select(y => y).Single();
        Console.Write($" {count}\n");
        result.Add(new SysObject
        {
            Database = database,
            ObjectName = name,
            Rows = count
        });
    }
    return result;
}

public class SysObject
{
    public string Database { get; set; }
    public string ObjectName { get; set; }
    public string ObjectType { get; set; }
    public string IndexName { get; set; }
    public long Rows { get; set; }
    public long? TotalPages { get; set; }
    public long? UsedPages { get; set; }
    public long? DataPages { get; set; }
    public long? TotalSpaceMB { get; set; }
    public long? UsedSpaceMB { get; set; }
    public long? DataSpaceMB { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Это ошибка в LINQPad.Метод ExecuteQueryDynamic должен учитывать DataContext CommandTimeout.

Это теперь исправлено (по состоянию на 5.37.4, в настоящее время в бета-версии).

Обратите внимание, что Util.CurrentDataContext является избыточным, если содержащий метод не является статическим.Select(y=>y) также является избыточным.Итак, в вашем примере вы можете просто сделать это:

CommandTimeout = 1;
var count = (int)ExecuteQueryDynamic($"SELECT count(*) FROM {database}.dbo.{name}").Single();
0 голосов
/ 08 марта 2019

Насколько я знаю, кроме установки времени ожидания команды или подключения в клиенте, невозможно изменить время ожидания для запроса на сервере.

Вы можете попробовать этот способ, который работает нормальнодля меня:

Непосредственно перед выполнением фактического запроса установите его для своего запроса

SET LOCK_TIMEOUT 1000;   --1 second

и после выполнения запроса установите его обратно в исходное значение.Значение по умолчанию для запуска запроса: 600 секунд.

...