SqlDataAdapter объект CommandTimeOut не работает в C # - PullRequest
0 голосов
/ 07 ноября 2019

Я использую SqlDataAdapter, чтобы извлечь результат из хранимой процедуры, выполнение которой занимает до 5 минут, и вернуть результат.

Я использую

da.SelectCommand.CommandTimeout = 1800;

настройка, но тайм-аут не работает. Код не соблюдает тайм-аут в реальном времени. Это не удается раньше.

Есть идеи, как исправить это время ожидания?

Это мой код:

var cpdbconn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL"].ConnectionString);   

using (SqlCommand cmd = new SqlCommand()) 
{
    cmd.Connection = cpdbconnection; 
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = readStoredProcedureName;

    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
    {
        try
        {
            da.SelectCommand.CommandTimeout = 1800;
            da.Fill(dt);

            // Check datatable is null or not
            if (dt != null && dt.Rows.Count > 0)
            {
                foreach (DataRow dataRow in dt.Rows)
                {
                    lstring.Add(Convert.ToString(dataRow["ServerName"]));
                }
            }

            // Add "','" in each row to convert the result to support nested query format
            InnerQryResultStr = string.Join("','", lstring.ToArray());

            if (multinestedQry != null)
            {
                combinedQry = qryName;
                qryName = multinestedQry + "('" + InnerQryResultStr + "')";
            }
            else
            {
                qryName = qryName + "('" + InnerQryResultStr + "')";
            }
        }
        catch (SqlException e)
        {
            Logger.Log(LOGTYPE.Error, String.Format("Inserting Data Failed for server {0} with Exception {1}", "DiscreteServerData", e.Message));

            if(e.Number == -2)
            {
                Logger.Log(LOGTYPE.Error, String.Format("TimeOut occurred while executing SQL query / stored procedure ", "DiscreteServerData", e.Message));
            }

            strMsg = e.Message.ToString();
            file.WriteLine(strMsg.ToString());
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Вы пытались установить время ожидания на SqlCommand? cmd.CommandTimeout = 300;

0 голосов
/ 07 ноября 2019

При работе с базами данных существует целый ряд тайм-аутов:

Команда имеет тайм-аут .

У соединения есть тайм-аут.

Тайм-аут каждого слоя сетевой части.

Тайм-аут сервера на другом конце.

Сервер на другом конце может иметь медленная защита лори .

Время блокировки и транзакции может истечь (потому что в какой-то момент кто-то другой может захотеть работать и с этой таблицей).

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

Распространено слишком много ошибок, даже если я ничего не могу вспомнитьэтот масштаб (самый большой был в 100 тысячах). Пользователь не может обработать информацию такого рода, поэтому требуется дополнительная фильтрация, разбиение на страницы и тому подобное. Никогда не делайте эти шаги в Клиенте. В лучшем случае вы передаете бесполезные объемы данных по сети. В худшем случае вы сталкиваетесь с таймаутами и проблемами параллелизма. Всегда выполняйте в запросе как можно больше фильтрации, разбивки на страницы и т. Д.

Вы хотите получить как можно меньше данных в целом. Массовые операции, такие как объединение, резервное копирование и т. Д., Как правило, должны выполняться в СУБД. Если вы перенесете его на клиент, вы добавите еще один уровень отказа и два сетевых способа передачи данных.

Для лучшего ответа мне потребуется более точная информация о проблеме.

...