У меня есть программа 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);
}
}
}