Команда C # Sqltimeout не знает сторону программы или сторону сервера sql - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть программа ac #, которая подключается к серверу sql и получает данные.Эта часть программы, которая подключается к sql, имеет множество классов и наследование, которое я не написал, и мне никогда не удавалось получить исключения sqltimeout из того, который подключается к серверу sql и получает данные.

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

это ошибка:

System.Exception: Ошибка в процессе 'dbsource' Команда InПоследовательность 1. Ошибка при запуске. Команда «dbsource»: System.Data.SqlClient.SqlException (0x80131904): Истекло время ожидания.Время ожидания истекло до завершения операции или сервер не отвечает.---> System.ComponentModel.Win32Exception (0x80004005): Тайм-аут операции ожидания в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое значение breakConnection, действие `1 wrapCloseInAction) в System.Data.SqlParning.Windows(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)

Это некоторая часть класса sqlconnection с именем dbsource:

using (var con = new SqlConnection(setting.ConnectionString))
                    {
                        using (SqlCommand command = new SqlCommand("SET ARITHABORT ON", con))
                        {
                            try
                            {
                                command.CommandText = base.HtmlCommand.Attributes["procedurename"];
                            }
                            catch
                            {
                                if (string.IsNullOrEmpty(setting.ProcedureName))
                                {
                                    command.CommandText = HtmlCommand.HttpContext.CurrentSetting.DEFAULT_ProcedureName;
                                }
                                else
                                {
                                    command.CommandText = setting.ProcedureName;
                                }
                            }

                            var paramsNode = HtmlCommand.TagElements.SingleOrDefault(x => x.TagName == "params");
                            var nameValuePairTblParam = new System.Data.DataTable();
                            nameValuePairTblParam.Columns.Add("name");
                            nameValuePairTblParam.Columns.Add("Value");
                            if (paramsNode != null)
                            {
                                foreach (var node in paramsNode.TagElements)
                                {
                                    try
                                    {
                                        nameValuePairTblParam.Rows.Add(node.GetAttributeValue("name"), node.GetAttributeValue("value", true));
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new Exception("Error in Read Params Section!", ex);
                                    }
                                }
                            }
                            command.CommandType = CommandType.StoredProcedure;
                            StringBuilder sb = new StringBuilder();
                            HtmlCommand.WriteOuterHtml(sb, "params");
                            command.Parameters.Add(new SqlParameter("@c", sb.ToString()));
                            command.Parameters.Add(new SqlParameter("@x", HtmlCommand.HttpContext.Request.DomainId));
                            command.Parameters.Add(new SqlParameter("@y", nameValuePairTblParam));

                            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
                            {                                
                                    adapter.Fill(dataSet);                                                               
                            }
                        }
                    }

Существует метод RenderingWrapper, который управляет параллельным образом:

private void RenderingWrapper(bool async)
        {
WaitToLoadAllPendingSource(Core, true);
}

protected void WaitToLoadAllPendingSource(string core, bool forIfAttrOnly)
        {
            CheckDataSourcePending(forIfAttrOnly);
            DataSourceAdded();
            if (PendingSource.Count != 0)
            {
                if (OwnerGroup.AllSourceLoaded)
                {
#if DEBUG
                    Util.Log(string.Format("{0:000#} - {1} Stop Process For Not Exist Datasource '{2}' Without Wait...", ID, core, string.Join("','", PendingSource)), ConsoleColor.Red);
#endif
                    return;
                }
#if DEBUG
                Util.Log(string.Format("{0:000#} - {1} Wait Start For '{2}'...", ID, core, string.Join("','", PendingSource)), ConsoleColor.DarkCyan);
#endif
                _waitHandle = new AutoResetEvent(false);
                Thread process = new Thread(() =>
                {
                    while (_waitHandle != null)
                    {
                        Thread.Sleep(1);
                        CheckDataSourcePending(forIfAttrOnly);
                        DataSourceAdded();
                    }
                });

                process.Start();
                _waitHandle.WaitOne(Parent.HttpContext.CurrentSetting.DEFAULT_ExecuteCMSCommandWaitTimeout);
                _waitHandle.Dispose();
                _waitHandle = null;
#if DEBUG
                Util.Log(string.Format("{0:000#} - {1} Wait End.", ID, core), ConsoleColor.DarkCyan);
#endif
                CheckDataSourcePending(forIfAttrOnly);
                DataSourceAdded();
            }
        }

public virtual void DataSourceAdded()
        {
            lock (_check_data_source_lock)
            {

                if (PendingSource != null)
                {
                    foreach (var pendingSource in PendingSource.ToArray())
                    {
                        try
                        {
                            OwnerGroup.GetSource(pendingSource);
                            //check if null
                            //if added by reza
                            if (PendingSource != null)
                                PendingSource.Remove(pendingSource);
                        }
                        catch {/*Nothing*/}
                    }
                }

                if (PendingSource == null || PendingSource.Count == 0)
                {
                    try
                    {
                        if (_waitHandle != null)
                        {
                            _waitHandle.Set();
                        }
                    }
                    catch { /*Nothing*/}
                }
            }
        }


public override void CheckDataSourcePending(bool forIfAttrOnly)
        {
            if (Attributes != null)
            {
                if (forIfAttrOnly)
                {
                    try
                    {
                        var value = Attributes["filter"];
                        Attributes["filter"] = InitalizeStringFromSource(value);
                    }
                    catch {/*Nothing*/ }
                }
                else
                {
                    foreach (var key in Attributes.Keys.ToArray())
                    {
                        try
                        {
                            var value = Attributes[key];
                            Attributes[key] = InitalizeStringFromSource(value);
                        }
                        catch { /*Nothing*/}
                    }
                }
            }
            if (Elements != null && !forIfAttrOnly)
            {
                foreach (HtmlElement child in Elements)
                {
                    child.CheckDataSourcePending(false);
                }
            }
        }
...